在父亲和孩子之间发送信号是行不通的

时间:2015-04-06 09:32:06

标签: c linux

考虑以下程序,其中进程父创建进程子进程,父进程应在屏幕'A'和'B'上打印,子进程写'C'和'D'。 问题是我希望程序仅以“ACBD”结果 这是代码:

void main () {
int pid;
signal(SIGUSR1,SIG_IGN);
if (pid=fork()) {
    printf("A");
    kill(pid,SIGUSR1);
    pause();
    printf("B");
}
else {
    pause();
    printf("C");
    kill(getppid(),SIGUSR1);
    printf("D");
}
}

但它的输出没什么! 任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

父母有可能在'孩子'还没有活着的时候发送信号。在父代码中调用kill之前添加sleep(1)。然而,这不是很好的解决方案......此外,您应该添加信号处理函数(即使是空函数)。您还应该知道输出是缓冲的 - 这意味着它不会立即被推送到终端,您可以通过添加“\ n”或调用fflush(stdout)强制推送它。

#include <stdio.h> 
#include <signal.h>
void main () {
int pid;
void signal_handler(int test) {}
signal(SIGUSR1, signal_handler);
if (pid=fork()) {
    printf("A");
    fflush(stdout);
    sleep(1);
    kill(pid,SIGUSR1);
    pause();
    printf("B");
    fflush(stdout);
}
else {
    pause();
    printf("C");
    fflush(stdout);
    kill(getppid(),SIGUSR1);
    printf("D");
    fflush(stdout); 
  }
}