Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 与分叉和全局变量混淆_C_Multithreading_Fork - Fatal编程技术网

C 与分叉和全局变量混淆

C 与分叉和全局变量混淆,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,

为什么第22行的打印结果是1而不是3
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个alreadyPerhaps
man 2 fork中所述“子进程和父进程在单独的内存空间中运行”。换句话说,“子进程是父进程的完全副本…”,但是在单独的内存空间中创建。因此,它继承了
fork
时的全局值,但此后不会被任何其他进程更新。因此,您认为当时调用了
handlerA
?怎么做?@Superman噢,既然它是异步的,那么这意味着计数可以是0还是2?”已经修改了“怎么做?”如在增加了2个alreadyPerhaps
man 2 fork
“子进程和父进程在不同的内存空间中运行。”换句话说,“子进程是父进程的精确副本…”,但是在单独的内存空间中创建。因此,它继承了
fork
时的全局值,但此后不会被任何其他进程更新。因此,您认为当时调用了
handlerA
?怎么做?@Superman噢,既然它是异步的,那么这意味着计数可以是0或2吗?