+-
让子进程等待父进程
我必须用C编写一个程序,该程序将派生一个新进程,然后将该进程pid用于另一个功能.但是我需要在子进程可以运行之前调用此函数,而且我不知道如何执行此操作.

这是我要执行的操作的一些伪代码.

pid_t pid = fork();
if(in_child){    //In the child process
    //launch child application
    //somehow stop the child application before it actually executes any code
}
else{
    //call my function with the child's pid
    //resume the child process
    //do other stuff
}

如果您需要任何其他信息,请询问.谢谢.

编辑:我无权访问该孩子的代码.我只是想运行一个可执行文件.

最佳答案
如果您指的是任何代码,那可能很困难.您可以使用带有CLONE_STOPPED的克隆而不是fork来将应用程序启动到停止状态(需要SIGCONT使其重新运行).

但是,如果您只是在子代码中指特定的代码,并且可以修改子代码,那么作为主要的第一件事,您可以简单地为USR1信号设置处理程序(任何IPC都可以这样做,但是信号似乎是最简单的) (在这种情况下),然后等待它着火再继续.

这样,该流程本身将开始运行,但尚未执行任何操作.

然后,您可以让父级编织需要做的任何魔术,然后将SIGUSR1发送给子级.

但是由于根据评论,您无权访问客户端代码,因此第一个选项可能是最好的,假设SIGCONT不会真正导致孩子出现问题.这将需要测试.

当然,要记住的一件事是clone()和fork()都不会实际上将新程序加载到子进程中,这必须在拆分后通过exec类型调用来完成.这是UNIX在fork和exec功能之间进行拆分的结果,详细信息为here.

这意味着,虽然您不控制子程序,但可以控制子进程,因此您的代码可以等待它想要的任何信号,然后再加载新的子程序.因此,即使仅使用fork()也是可行的.

不幸的是,这也意味着克隆或fork都不会在新程序加载了exec之后停止进程(至少不是确定性的),因此,如果您要摆弄新程序(例如通过以下方式操纵其变量)附加到其内存),则无法执行.

最好的办法是在新进程仍然保留旧程序副本的情况下(在exec之前)摆弄新进程.

点击查看更多相关文章

转载注明原文:让子进程等待父进程 - 乐贴网