使用fork和kill信号

时间:2013-12-14 22:32:55

标签: c signals fork kill

int main() {
    int pid = fork();
    if(pid > 0){
        kill(pid, SIGKILL);
        printf("a");
    }else{
        /* getppid() returns the pid
        of the parent process */
        kill(getppid(), SIGKILL);
        printf("b");
    }
}

代码片段的结果可能是:没有,a,b,ab,ba

我不明白为什么没有,ab和ba是可能的。

int a = 1;
void handler(int sig){
    a = 0;
}
void emptyhandler(int sig){
}
int main() {
    signal(SIGINT, handler);
    signal(SIGCONT, emptyhandler);

    int pid = fork();
    if(pid == 0){
        while(a == 1)
            pause();
        printf("a");
    }else{
        kill(pid, SIGCONT);
        printf("b");
        kill(pid, SIGINT);
        printf("c");
    }
}

这个导致bac,bca。

我不确定为什么“进程不终止”也有效?为什么SIGINT会杀了它?

2 个答案:

答案 0 :(得分:2)

没有人知道哪个孩子/父母先跑了。或者,如果您有多个核心,它们可能会并行运行,或者操作系统可能会在任何执行点中断它们并运行其他子进程或父进程(或某些其他进程)。 kill()也是异步的,它发送信号,后来在kill()返回后可能由接收者处理。

没什么:父母在kill(pid, SIGKILL);之后就被杀死了。儿童在kill(getppid(), SIGKILL);

之后立即被杀害

“a”:儿童在kill(getppid(), SIGKILL);之前或之后被杀死。家长可以跑到完成。​​

“b”:父母在kill(pid, SIGKILL);之前或之后被杀死。孩子跑完了。

“ab”父母在打印“a”之后立即被杀死(或者它可能在子信号到达之前设法运行完成),孩子在打印“b”后被杀死(或也许它设法在父信号到来之前运行完成)

“ba”与“ab”相同的情况,只是孩子被安排先打印“b”。

答案 1 :(得分:0)

发送信号不构成两个进程之间的任何类型的同步。只有发送接收信号才能让您得出结论(例如打印a)在其他内容之后发生(例如打印b)。这两种信号都可以“在飞行中”而不会被任何人接收。