相关疑难解决方法(0)

Waitpid相当于超时?

想象一下,我有一个启动多个子进程的进程.父母需要知道孩子什么时候退出.

我可以使用waitpid,但是如果/当父需要退出时,我无法告诉阻塞的线程waitpid优雅地退出并加入它.让事情自己清理是件好事,但这可能不是什么大不了的事.

我可以用waitpidWNOHANG,然后睡了一段任意时间,以防止忙等待.然而,我只能知道一个孩子是否经常退出.在我的情况下,我知道孩子何时立即离开可能不是超级关键,但我想尽快知道...

我可以使用信号处理程序SIGCHLD,并在信号处理程序中执行当子项退出时要执行的任何操作,或者将消息发送到其他线程以执行某些操作.但是使用信号处理程序会稍微混淆代码流.

我真正想做的是使用waitpid一些超时,比如5秒.由于退出进程不是一个时间关键的操作,我可以懒惰地发出线程信号退出,同时仍然在waitpid其余时间阻塞它,随时准备做出反应.在linux中有这样的调用吗?在替代方案中,哪一个最好?


编辑:

基于回复的另一种方法是SIGCHLDpthread\ 来阻塞所有线程_sigmask().然后在一个线程中,sigtimedwait()一边寻找一边打电话SIGCHLD.这意味着我可以超时调用并检查线程是否应该退出,如果没有,则保持阻塞状态等待信号.一旦a SIGCHLD被传递到这个线程,我们可以立即对它做出反应,并且在等待线程的行中,不使用信号处理程序.

c c++ linux

47
推荐指数
5
解决办法
3万
查看次数

我如何在C中执行exec()后台进程?

我在进程上做了一个fork和exec(),但是我想在后台运行它.我怎样才能做到这一点?我可以避免在它上面调用waitpid,但是然后进程永远在那里,等待将它的状态返回给父进程.还有其他方法可以做到这一点吗?

c process exec

13
推荐指数
2
解决办法
2万
查看次数

Linux,waitpid,WNOHANG和僵尸

我需要能够:

  1. fork一个进程并使其成为execvp(我做到了)
  2. 检查子进程execvp是否成功(不知道如何)
  3. 检查子进程是否完成(有问题)

我正在寻求一个过程,我没有办法检查孩子的execvp是否有效.如果失败了,我需要知道它失败了.目前我正在使用

-1 != waitpid( pid, &status, WNOHANG )
Run Code Online (Sandbox Code Playgroud)

但似乎如果pid进程的execv失败,waitpid不会返回-1.

我该怎么检查?我读了waitpid手册页,但我不清楚; 也许我的英语不够好.

编辑:为了解释更多:
我正在为家庭作业建立自己的终端.我需要输入一个命令字符串,让我们说"ls",然后我必须执行命令.
在子forks之后,子进程调用execvp来执行命令(在我解析字符串之后),并且父进程需要检查命令末尾是否有'&'.
如果命令末尾不存在符号'&',则父进程需要等待子进程执行.

所以我需要知道execvp是否失败了.如果它没有失败,则父使用waitpid等待子进程完成执行.如果失败,那么父母将不会等待孩子.

c c++ fork wait waitpid

6
推荐指数
1
解决办法
9360
查看次数

标签 统计

c ×3

c++ ×2

exec ×1

fork ×1

linux ×1

process ×1

wait ×1

waitpid ×1