char array[ARRAY_SIZE];
void child_process_routine(){
int j;
for(j = 0;j<ARRAY_SIZE;j++)
array[j]='d';
}
main()
{
pid_t child_pid;
int i;
for(i = 0;i<ARRAY_SIZE;i++)
array[i]='c';
child_pid = fork();
switch (child_pid) {
case -1:
perror("error");
exit(1);
case 0:
child_process_routine();
exit(0);
default:
wait(NULL);
}
print_array(array);
}
你能解释一下为什么父进程不等待子进程,这又给了我输出“cccccc”吗?它在子进程中被改为“dddddd”
等待(NULL)甚至做什么?
应该怎么知道它应该等待子进程?
答案 0 :(得分:0)
父进程 等待子进程。
子进程不是一个线程,它是一个完全不同的进程,它有自己唯一的PID,父进程是父PID。子节点和父节点不共享相同的数组,子节点有自己的副本,因为它是一个不同的进程(不是同一进程的线程)。因此,当您在子节点中将数组设置为“d”时,它不会影响父进程中的数组。
尝试在退出之前在子进程流中放置一个sleep(20),并在父wait()之前放置一个printf()。当父母等待孩子完成时,您将看到您的申请暂停。
答案 1 :(得分:0)
fork()创建一个不同的进程,但父级共享相同的进程上下文。
但是如果您尝试更改父级的堆栈段中的任何内容,则会复制该内容并为子进程创建单独的堆栈,但不会为子进程复制所有资源(如数据段,代码段等)。他们都分享。
调用fork后更改数据的复制&#34; copy on write&#34;
父进程正在等待子进程完成。但它的父母和孩子的原则分别和两者的不同数据