C 与分叉和全局变量混淆
为什么第22行的打印结果是1而不是3C 与分叉和全局变量混淆,c,multithreading,fork,C,Multithreading,Fork,为什么第22行的打印结果是1而不是3count是一个全局变量,它已经在handlerA中修改过了,那么为什么它没有在第21行和第22行保留它的值呢 1 pid_t pid; 2 int count = 0; 3 4 void handlerA(int sig) { 5 count += 2 6 printf("count = %d\n", count); 7 fflush(stdout); 8 kill(pid,
count
是一个全局变量,它已经在handlerA中修改过了,那么为什么它没有在第21行和第22行保留它的值呢
1 pid_t pid;
2 int count = 0;
3
4 void handlerA(int sig) {
5 count += 2
6 printf("count = %d\n", count);
7 fflush(stdout);
8 kill(pid, SIGUSR1);
9 }
10
11 void handlerB(int sig) {
12 count += 3;
13 printf("count = %d\n", count);
14 fflush(stdout);
15 exit(0);
16 }
17
18 int main() {
19 signal(SIGUSR1, handlerA);
20 if ((pid = fork()) == 0) {
21 count++;
22 printf("count = %d\n", count);
23 fflush(stdout);
24 signal(SIGUSR1, handlerB);
25 kill(getpid(), SIGUSR1);
26 while (1) {};
27 }
28 else {
29 wait();
30 count += 4;
31 printf("count = %d\n", count);
32 fflush(stdout);
33 }
34 return 0;
35 }
我认为混淆源于:它是一个简单地将
handlerA
设置为处理SIGUSR1
的函数
在到达时间线22时,没有调用该信号,也没有以任何方式触发任何处理程序。因此程序调用fork()
和count
从0递增到1,就像预期的那样
如果同时使用kill(pid,SIGUSR1),您将看到预期的行为代码>在main
叉子前面的某个地方
不要在该信号的相应处理程序中重新提升信号。我认为混淆的原因在于:这是一个函数,它只是将handlerA
设置为处理SIGUSR1
在到达时间线22时,没有调用该信号,也没有以任何方式触发任何处理程序。因此程序调用fork()
和count
从0递增到1,就像预期的那样
如果同时使用kill(pid,SIGUSR1),您将看到预期的行为代码>在main
叉子前面的某个地方
不要在该信号的相应处理程序中重新提升信号。“已修改”如何?如在增加2个alreadyPerhapsman 2 fork中所述“子进程和父进程在单独的内存空间中运行”。换句话说,“子进程是父进程的完全副本…”,但是在单独的内存空间中创建。因此,它继承了fork
时的全局值,但此后不会被任何其他进程更新。因此,您认为当时调用了handlerA
?怎么做?@Superman噢,既然它是异步的,那么这意味着计数可以是0还是2?”已经修改了“怎么做?”如在增加了2个alreadyPerhapsman 2 fork
“子进程和父进程在不同的内存空间中运行。”换句话说,“子进程是父进程的精确副本…”,但是在单独的内存空间中创建。因此,它继承了fork
时的全局值,但此后不会被任何其他进程更新。因此,您认为当时调用了handlerA
?怎么做?@Superman噢,既然它是异步的,那么这意味着计数可以是0或2吗?