我正在尝试更改子进程内的变量值,并将其保留给程序的其余部分。所以在下面的例子中为什么我的cout继续打印0,我该如何解决呢?
int var = 0;
int pid = fork();
if (pid == 0){ //child process
var = 1;
exit(1);
}
else if (pid> 0){ //parent process
if (-1 == wait (0))
perror ("there was an error with wait");
}
cout << var;
答案 0 :(得分:3)
这就是代码执行的方式。
子过程
int var =0;
var = 1;
exit (1);
家长流程
int var =0;
if (-1 == wait (0))
perror ("there was an error with wait);
cout << var;
正如您所看到的,父进程不会更改var
。
当您fork
时,子级和父级具有在分割为执行路径之前存在的变量的单独副本。 流程不会共享相同的内存块。因此,更改子级var
不会影响父级中的var
。
如果您想要相同内存上的多个执行路径,则应使用线程。
感谢您的阅读。
答案 1 :(得分:0)
看起来fork()调用失败了。检查errno值
返回值 成功时,子进程的PID在父进程中返回,并在子进程中返回0。失败时,在父项中返回-1,不创建子进程,并正确设置errno。
错误 EAGAIN fork()无法分配足够的内存来复制父页面表并为子节点分配任务结构。 EAGAIN 由于遇到调用者的RLIMIT_NPROC资源限制,因此无法创建新进程。要超过此限制,进程必须具有CAP_SYS_ADMIN或CAP_SYS_RESOURCE功能。 ENOMEM fork()无法分配必要的内核结构,因为内存很紧张。
符合SVr4,4.3BSD,POSIX.1-2001。