虚位以待(AD)
虚位以待(AD)
首页 > 操作系统 > LINUX > Linux C 进程间的信号通信

Linux C 进程间的信号通信
类别:LINUX   作者:码皇   来源:<a href="http://blog.csdn.net/trb331617" target="_blank" rel="nofollow&q   点击:

Linux C 进程间的信号通信。1、信号通信内核中存在64种信号,即linux 内核可以发送64种信号,命令“kill -l”可以查看。2、getpid() 获得进程 id 号3、exit(0) 等价于 kill(getppid(), 17) 即,向父进程发送 17 信号(SIGCHLD)4、wait(NULL) 可回收僵尸进程。

1、信号通信

内核中存在64种信号,即linux 内核可以发送64种信号,命令“kill -l”可以查看

A - 信号的发送:kill、raise、alarm

kill(pid_t pid, int sig)

raise(int sig) 等价于 kill(getpid(), int sig) 即发给自己

附:终止进程 kill 9 进程号 或 raise(9) 终止自己 (9为SIGKILL信号)

alarm(int n) 定时 n 秒

B - 信号的接收:pause、sleep、while

C - 信号的处理:signal

处理哪个信号

以什么方式处理(SIG_IGN忽略,SIG_DFL默认,myfun自定义)

2、getpid() 获得进程 id 号

getppid()获得父进程 id 号

3、exit(0) 等价于 kill(getppid(), 17) 即,向父进程发送 17 信号(SIGCHLD)

4、wait(NULL) 可回收僵尸进程。本身为阻塞函数

代码:

    #include <stdio.h> //standard input output #include <sys types.h=""> //pid_t pid;
    fork() #include <signal.h> //signal #include <stdlib.h> //exit(0) 否则会有warning警告 void myfun(int sig) {
    int i;
    for(i = 0;
    i < 5;
    i++) {
    printf("sig = %d, i = %dn",sig,i);
    sleep(1);
    }
    return;
    }
    void myfun1(int sig) {
    printf("NOTE: exit() sig = %dn",sig);
    wait(NULL);
    printf("NOTE: child process has been retrieved.n");
    return;
    }
    int main() {
    pid_t pid;
    pid = fork();
    if(pid > 0) {
    printf("parent pid = %dn",getpid());
    int i = 0;
    signal(10, myfun);
    //wait(NULL);
    回收子进程的僵尸进程。但wait是阻塞函数。等待子进程结束时,后面的代码将无法执行 signal(17,myfun1);
    while(1) {
    printf("parent process i = %dn",i);
    sleep(1);
    i++;
    }
    }
    if(pid == 0) {
    printf("child pid = %d, parent pid = %dn", getpid(), getppid());
    sleep(3);
    kill(getppid(),10);
    //getppid()获取父进程id。10为SIGUSR1信号 sleep(3);
    exit(0);
    //等价于 kill(getppid(),17)。17 为 SIGCHLD信号 }
    return 0;
    }
    </stdlib.h></signal.h></sys></stdio.h>
执行:

相关热词搜索: