【问题标题】:parent process does not wait for the child process (c code)父进程不等待子进程(c代码)
【发布时间】:2016-03-26 16:30:07
【问题描述】:
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 ”

wait(NULL) 有什么作用?

它应该如何知道它应该等待子进程?

【问题讨论】:

  • 子节点获得父节点地址空间的副本。对array[] 的更改仅对子副本进行,父副本保持不变。根据您的操作系统,您可以获得特殊的“共享”内存,其中两个进程都可以看到更改。

标签: c process fork wait


【解决方案1】:

父进程正在等待子进程。

子进程不是线程,它是一个完全不同的进程,有自己唯一的 PID,父进程作为父进程 PID。子和父不共享同一个数组,子有自己的副本,因为它是不同的进程(不是同一进程的线程)。因此,当您在子进程中将数组设置为“d”时,它不会影响父进程中的数组。

尝试在子进程流退出之前在子进程流中放置一个 sleep(20),并在父进程 wait() 之前放置一个 printf()。您会看到您的应用程序暂停,因为父母正在等待孩子完成。

【讨论】:

  • 是的,我假设全局变量将在父子之间共享,就像它在线程中的方式一样。谢谢大家的答案。这个问题严格要求父母打印更新后的数组,关于如何实现这一点的任何想法?
  • 如果父母需要知道孩子在做什么,那么您需要在他们之间打开管道,让孩子与父母交谈。
【解决方案2】:

fork() 创建一个不同的进程,但父进程共享相同的进程上下文。

但是如果您尝试更改父进程堆栈段中的任何内容,它会复制该堆栈段并为子进程创建一个单独的堆栈,但不会为子进程复制所有资源(如数据段、代码段等)。他们都共享它。

这种在fork后改变数据的复制称为“写时复制”

父进程正在等待子进程完成。但是它分别为父母和孩子打印,并且两者的数据不同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多