+-

我必须用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之前)摆弄新进程.
点击查看更多相关文章
转载注明原文:让子进程等待父进程 - 乐贴网