C 信号和信号,它做什么?

C 信号和信号,它做什么?,c,signals,fork,C,Signals,Fork,我被要求找出这个问题中所有可能的结果: #define N 4 int val = 9; void handler(sig) { val += 3; return; } int main() { pid_t pid; int i; signal(SIGCHLD,handler); for (i=0;i<N;i++) { if ((pid =fork()) == 0) { val -= 3; exit(0); }

我被要求找出这个问题中所有可能的结果:

#define N 4
int val = 9;
void handler(sig) {
   val += 3;
   return;
}
int main() {
  pid_t pid;
  int i;
  signal(SIGCHLD,handler);
  for (i=0;i<N;i++) {
    if ((pid =fork()) == 0) {
        val -= 3;
        exit(0);
    }
  }
  for (i=0;i<N;i++) {
    waitpid(-1,NULL,0);
  }
  printf("val = %d\n",val);
}
西格尔德是干什么的?你能解释一下这个问题中的for循环吗

编译和运行这些代码需要哪些必要的库呢?

Odd程序

我想我要告诉你们的是SIGCHLD是什么引起的,以及子进程中的一个变量是如何被子进程改变的,它对父进程没有影响

当您使用fork()时,您将创建一个子进程。听起来熟悉吗?父进程(称为fork()的进程)接收信号。处理程序被执行。当你运行程序时,你应该看到21个

这是因为每次执行信号处理程序9+(3*4)=21时,val都会增加3。 代码创建了四个子项

子进程

val-=3; 出口(0)

递减val。但由于这是在另一个进程中发生的,而不是在原始子进程中,因此它不会触及“原始”val变量,因为它有自己的本地副本。

奇数程序

我想我要告诉你们的是SIGCHLD是什么引起的,以及子进程中的一个变量是如何被子进程改变的,它对父进程没有影响

当您使用fork()时,您将创建一个子进程。听起来熟悉吗?父进程(称为fork()的进程)接收信号。处理程序被执行。当你运行程序时,你应该看到21个

这是因为每次执行信号处理程序9+(3*4)=21时,val都会增加3。 代码创建了四个子项

子进程

val-=3; 出口(0)


递减val。但由于这发生在另一个进程(而不是原始子进程)中,因此它不会触及“原始”val变量,因为它有自己的本地副本。

当您从父进程派生子进程时,会设置SIGCHLD,但不会执行处理程序函数。
在子函数退出后,它将触发SIGCHLD,从而导致处理函数中的代码执行

从父进程派生子进程时,会设置SIGCHLD,但不会执行handler函数。
在子函数退出后,它将触发SIGCHLD,从而导致处理函数中的代码执行

我相信@jim mcnamara的答案并没有列出所有可能的结果


我相信@jim mcnamara的答案并没有列出所有可能的输出


9+(3*k)对于1个以上的信号:
man7信号
更多的信号:
signal-l
尽管谷歌不纳税,这个链接可能有用,“SIGCHLD手册页”。。顺便说一句,我在星巴克的唯一一次是喝了一杯slashFirst:RTFM不会帮上忙的。我的意见是。第二:要真正理解这一点,请阅读史蒂文斯的《UNIX环境中的高级编程》,我强烈推荐。更多信号:
man 7信号
更多信号:
signal-l
尽管谷歌不纳税,但此链接可能有用,“SIGCHLD man page”。。顺便说一句,我在星巴克的唯一一次是喝了一杯slashFirst:RTFM不会帮上忙的。我的意见是。第二:要真正理解这一点,请阅读史蒂文斯的《UNIX环境中的高级编程》——我极力推荐这本书。
SIGABRT - abnormal termination.
SIGFPE - floating point exception.
SIGILL - invalid instruction.
SIGINT - interactive attention request sent to the program.
SIGSEGV - invalid memory access.
SIGTERM - termination request sent to the program.