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