多进程编程

wait 和 waitpid

当一个进程正常或异常退出时,内核就向其父进程发送SIGCHLD信号。因为子进程退出是一个异步事件,所以该信号也是内核向父进程发送的异步信号。

wait的函数原型是:

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);

参数status用来保存被收集进程退出时的一些状态信息,它是一个指向int类型的指针。进程一旦调用了wait或waitpid,则可能发生:

这两个函数的区别在于:

下面看一个示例代码:

#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
    pid_t child;
    int i;
    child = fork();
    if(child < 0){
        printf("create failed!\n");
        return (1);
    }
    else if (0 == child){
        printf("this is the child process pid= %d\n",getpid());
        for(i = 0;i<5;i++){
            printf("this is the child process print %d !\n",i+1);
        }
        printf("the child end\n");
    }
    else{
        printf("this is the father process,ppid=%d\n",getppid());
        printf("father wait the child end\n");
        wait(&child);
        printf("father end\n");
    }

    return 0;
}

运行结果:
$ ./wait 
this is the father process,ppid=21831
father wait the child end
this is the child process pid= 22126
this is the child process print 1 !
this is the child process print 2 !
this is the child process print 3 !
this is the child process print 4 !
this is the child process print 5 !
the child end
father end

sigprocmask

有时候不希望在接到信号时就立即停止当前执行去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。这种情况是通过阻塞信号实现的,即调用sigprocmask系统函数。

sigprocmask功能描述:设定对信号屏蔽集内的信号的处理方式(阻塞或不阻塞)。函数原型:

#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

参数how用于指定信号修改的方式,可能选择有三种

屏蔽之后又能怎样呢?

To be continue …