在子进程之前执行父进程,反之亦然

时间:2016-01-20 00:27:37

标签: c process fork child-process

编辑:我修改了问题以使其更清晰。

我要么:

  1. 父进程修改数组,然后子进程显示更新的数组。
    1. 子进程修改数组,然后父进程显示更新的数组。
    2. 这是第一个场景的代码。子进程不显示更新的数组,而是显示原始数组。

      git@bitbucket.org:bla/blabla
      

4 个答案:

答案 0 :(得分:0)

使用semaphore。或者,如果您想要更简单的东西(但以性能为代价),您可以拥有int* parentWait = 1;并将其传递给子进程。当孩子完成该过程时,它可以将parentWait的内容更新为0​​。

然后,在父母的过程中,你可以拥有

while(parentWait){
  // do nothing.
}

虽然要注意,正如Ctx所指出的,这种方法需要指针parentWait指向shared map。所以,我建议你使用POSIX信号量。

答案 1 :(得分:0)

如果不使用共享内存,就无法满足要求。 当您<table align="center" border="0" cellpadding="0" cellspacing="0" height="100%" width="100%" style="border-collapse: collapse; background-color: #F2F2F2; height: 100% !important; max-width:600px !important;"> 时,孩子会获得父母内存的副本(包括数组)。但是,现在有两个不同的数组,两个进程都不能看到另一个进程对其副本的更改。

答案 2 :(得分:0)

在父上下文中使用sched _yield()系统调用后,它将在父进程之前先执行子进程

答案 3 :(得分:0)

您可以在父级中使用它:waitpid(p, 0, 0);

最好检查所有三个条件而不是使用(p!= 0),因为fork()调用有三个可能的输出:

if ( p == 0 )  
// Child Code  
else if ( p > 0 )  
// Parent Code  
else  
   printf("fork failed");  

至于首先执行父进程,通常不是一个好主意,因为它会创建一个孤立进程。孩子必须在父母之前终止。您可以在fork()调用之前的子进程之前执行要执行的代码。如果由于某些原因仍要先执行父级,则可以在子级中使用它:
      waitpid(getppid(), 0, 0);
库:
#include <sys/types.h>
#include <unistd.h>
#include<sys/wait.h>