gpt4 book ai didi

c - 让子进程等待父进程

转载 作者:太空狗 更新时间:2023-10-29 11:09:45 25 4
gpt4 key购买 nike

我必须用 C 语言编写一个程序,它将 fork 一个新进程,然后将该进程 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
}

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

编辑:我无权访问 child 的代码。我只想运行一个可执行文件。

最佳答案

如果您指的是任何 代码,那可能会很困难。您可以使用 cloneCLONE_STOPPED 而不是 fork 将应用程序启动到停止状态(需要 SIGCONT 让它再次运行)。

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

这样,进程本身将运行但不会执行任何操作。

然后您让父级编织它需要做的任何魔法,然后将 SIGUSR1 发送给子级。


但由于根据评论,您没有访问客户端代码,第一个选项可能是最好的,假设 SIGCONT 不会实际会给 child 带来问题。这将需要测试。


当然,要记住的一件事是 clone()fork() 都不会真正将您的新程序加载到子进程,必须通过 exec 类型的调用 after 拆分来完成。这是 forkexec 功能之间 UNIX 拆分的结果,详细信息 here .

这意味着,虽然您不控制子程序,但您确实控制了子进程,因此您的代码可以在加载之前等待它想要的任何信号启动新的子程序。因此,即使仅使用 fork() 也是可行的。

不幸的是,这也意味着在使用 exec 加载新程序后,clonefork 都不能停止您的进程(至少不是确定性的)所以,如果你想做的是对新程序(例如通过附加到它的内存来操纵它的变量),你不能这样做。

你能做的最好的事情就是在它仍然有旧程序的副本时摆弄新进程(在 exec 之前)。

关于c - 让子进程等待父进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16269975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com