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

C 在子进程之前执行父进程,反之亦然,c,process,fork,child-process,C,Process,Fork,Child Process,编辑:我修改了问题,使其更清楚。 我想要: 父进程修改数组,然后子进程显示更新的数组 或 子进程修改数组,然后父进程显示更新的数组 这是第一个场景的代码。子进程不显示更新的数组,而是显示原始数组 #include <stdio.h> void main(){ int p; int i; int values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; p = fork(); if (p != 0){

编辑:我修改了问题,使其更清楚。

我想要:

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

    #include <stdio.h>
    
    void main(){
        int p;
        int i;
        int values[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        p = fork();
        if (p != 0){
            for (i = 0; i < 10; i++){
                values[i] = values[i] * 100;
            }
        }else{
            printf("Updated elements: ");
            for (i = 0; i < 10; i++){
                printf("%d ", values[i]);
            }
        }
    }
    
    #包括
    void main(){
    INTP;
    int i;
    int值[]={1,2,3,4,5,6,7,8,9,10};
    p=fork();
    如果(p!=0){
    对于(i=0;i<10;i++){
    数值[i]=数值[i]*100;
    }
    }否则{
    printf(“更新元素:”);
    对于(i=0;i<10;i++){
    printf(“%d”,值[i]);
    }
    }
    }
    
    使用一个。或者,如果您想要更简单的东西(但以性能为代价),您可以使用
    int*parentWait=1
    并将其传递给子进程。当子进程完成时,它可以将
    parentWait
    的内容更新为0

    然后,在家长的过程中,您可以

    while(parentWait){
      // do nothing.
    }
    

    但是要注意,正如所指出的,这种方法需要指针
    parentWait
    指向一个。因此,我建议您使用POSIX信号量。

    如果不使用共享内存,您所要求的是不可能的。
    当您
    fork()
    时,子级将获得父级内存(包括数组)的副本。但是,现在有两个不同的数组,两个进程都看不到另一个进程对其副本所做的更改。

    在父上下文中使用
    sched\u yield()
    syscall,它将在父进程之前先执行子进程。

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

    如果您检查所有三个条件而不是使用(p!=0),也会更好,因为fork()调用有三种可能的输出:

    至于先执行父进程,这通常不是一个好主意,因为它会创建一个孤立进程。子项必须在父项之前终止。在fork()调用之前,可以在子进程之前执行要执行的代码。如果出于某种原因仍希望先执行父级,则可以在子级中使用此命令:
    waitpid(getppid(),0,0)
    图书馆:
    #包括

    #包括


    #包括

    当然可以。用信号灯,我想建议奥拉夫怎么做。这里是一个信号量的例子:如果我想做相反的事情,即父进程修改数组,然后子进程访问更新的数组,是否仍然需要信号量?如果只是为了测试,只需在子进程或父进程中的fork之后放一个sleep(1)(以第二个运行的为准)@Aleksandrus实际上你描述了一种信号量(这是一个更一般的概念),除了内存不是与
    fork
    @immibis共享之外。他可能在fork()之前设置了共享映射。我使用pthreads,它工作得很好。从未用过叉子。那么,这个解决方案不起作用吗?它不起作用,因为父进程和子进程将有单独的
    parentWait
    变量。子对象将其1设置为0。父母的仍然是1。哦,好吧。我会编辑这个答案。谢谢你让我知道
    if ( p == 0 )  
    // Child Code  
    else if ( p > 0 )  
    // Parent Code  
    else  
       printf("fork failed");