C 如何通知家长流程我已完成

C 如何通知家长流程我已完成,c,linux,C,Linux,这是一个非常基本的问题。父进程将创建一些共享内存,在其中放入两个整数,然后派生一个子进程,该子进程将进入共享内存并计算它们的总和。所有这些都很好,但是孩子如何通知家长已经完成了总和的计算?我是否需要在两个进程之间创建一个管道来执行此操作?或者waitpid()足以实现这一点 谢谢大家! 如果子项在写入总和后退出,则waitpid()就足够了。否则,您需要一些IPC(互斥锁/信号量/管道)来发出完成的信号。如果子进程在写入总和后退出,那么waitpid()就足够了。否则,您需要一些IPC(互斥锁/

这是一个非常基本的问题。父进程将创建一些共享内存,在其中放入两个整数,然后派生一个子进程,该子进程将进入共享内存并计算它们的总和。所有这些都很好,但是孩子如何通知家长已经完成了总和的计算?我是否需要在两个进程之间创建一个管道来执行此操作?或者waitpid()足以实现这一点


谢谢大家!

如果子项在写入总和后退出,则
waitpid()
就足够了。否则,您需要一些IPC(互斥锁/信号量/管道)来发出完成的信号。

如果子进程在写入总和后退出,那么
waitpid()
就足够了。否则,您需要一些IPC(互斥锁/信号量/管道)来发出完成的信号。

waitpid()
就可以了。只需在父级执行fork,然后在子级执行
waitpid()
并将其计算到共享内存位置,然后返回,
waitpid()
将解除阻止,父级可以使用该总和执行任何操作。

waitpid()
就可以了。只需在父级执行fork并在子级执行
waitpid()
并将其计算到共享内存位置,然后返回,
waitpid()
将解除阻止,父级可以使用该总和执行任何操作。

如果在计算完整数总和后不再需要子进程,它可以从main返回总和,父进程可以使用waitpid检索结果。在这种情况下,孩子看起来像这样:

子进程:

int main(int argc, char** argv) {
    int a,b;
    /* read integers a and b from shared memory */

    /* return sum */
    return a + b;
}

如果仍然需要子进程为父进程做进一步的工作,请在子进程和父进程之间设置一个管道,或者安排其他形式的IPC来来回传递信息。

如果在计算完整数和之后不再需要子进程,它可以从main返回总和,父进程可以使用waitpid检索结果。在这种情况下,孩子看起来像这样:

子进程:

int main(int argc, char** argv) {
    int a,b;
    /* read integers a and b from shared memory */

    /* return sum */
    return a + b;
}

如果子进程仍然需要为父进程做进一步的工作,请在子进程和父进程之间设置一个管道,或者安排其他形式的IPC来来回传递信息。

您是否尝试过
waitpid
,或者您是否在等待别人告诉您尝试它?@paddy Yea,我在最后提到了waitpid,但我不确定这是否足够,因为在我看来,waitpid()只在子进程终止时才被调用。但是,如果我希望子进程在计算总和后执行更多任务,该怎么办?在这种情况下,孩子需要通知家长已经完成了计算总和的工作,然后继续剩下的工作。您在帖子中没有提到孩子的进程是否需要退出。现在有一个很好的答案应该对你有帮助。我会考虑修改你的算法,以便<代码> WaITpId()<代码>就足够了。使子进程保持活动状态会使事情变得复杂一些,如果您的目的是重用子进程,那么可能是不必要的。显然,如果您想保留进程的某些内部状态,这不是一个选项。您是否尝试过
waitpid
,或者您正在等待别人告诉您尝试它?@paddy是的,我在最后提到了waitpid,但我不确定它是否足够,因为我觉得waitpid()仅在子进程终止时调用。但是,如果我希望子进程在计算总和后执行更多任务,该怎么办?在这种情况下,孩子需要通知家长已经完成了计算总和的工作,然后继续剩下的工作。您在帖子中没有提到孩子的进程是否需要退出。现在有一个很好的答案应该对你有帮助。我会考虑修改你的算法,以便<代码> WaITpId()<代码>就足够了。使子进程保持活动状态会使事情变得复杂一些,如果您的目的是重用子进程,那么可能是不必要的。显然,如果你想保留流程的某些内部状态,这不是一个选项。这正是我认为我应该做的。我考虑过在waitpid中使用status参数来表示求和任务的完成,但不确定是否可以这样做。这正是我认为我应该做的。我考虑过在waitpid中使用status参数来表示求和任务的完成,但不确定是否可以这样做。@williampersell:D'oh!我忘记了返回值附带的退出值。第一种解决方案糟透了——家长和孩子应该设置一个管道或IPC来进行通信。@williampersell:D'oh!我忘记了返回值附带的退出值。第一个解决方案很糟糕——父级和子级应该设置一个管道或IPC进行通信。