2013年6月

最近有一个程序,转移到另一台服务器上了,在接受返回值的时候一直出问题。

waitpid(pid, &status, WNOHANG);

WEXITSTATUS(status)老实返回16,郁闷。
最后发现是信号的问题。在fork子进程前,添加对子进程的信号接受就可以了。

signal(SIGCHLD,SIG_DFL);

#include 
#include 
#include 
int main(void)
{
    pid_t   pid;
    printf("father-pgrpid=[%d]n", getpgrp());
    pid = fork();
    if (pid < 0) {
        printf("fork errn");
    } else if (pid == 0) {
        setpgrp();
        printf("child-pid[%d]n", getpid());
        printf("child-pgrpid=[%d]n", getpgrp());
        if(pid=fork() <0) {
            printf("fork errn");
        }else if (pid == 0) {
            while(1)
                sleep(10);
            exit(0);
        }
        sleep(100);
        exit(1);
    }else{
        sleep(1);
        printf("fathern");
        if(kill(-pid, SIGTERM) != 0) {
            perror("kill");
        }else{
            printf("killed okn");
        }
    }
}