问题标签 [waitpid]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
unix - UNIX 进程:fork() 和 wait()
这是我的问题fork()
以及wait()
将要发生的问题:
在 mymain()
中,我调用了一个函数,假设function()
它使用fork()
系统调用,但我想function()
返回而不等待孩子终止,因此main()
必须在终止之前等待它们。
那么,是否可以main()
调用已在另一个名为 my this 的函数的主体中编辑的wait()
孩子?fork()
main()
如果是,我是否必须main()
通过变量将孩子的 pid 传递给?
c++ - C ++中的Waitpid创建问题
我正在使用给定的waitpid
waitpid(childPID, &status, WNOHANG);
这用于无限循环内的程序中,该循环在需要时分叉,父进程等待子进程返回。但是最近我遇到了一个问题,在将其打印到 cerr 后程序退出。
waitpid:没有子进程
这始终是程序崩溃/退出之前的最后一个日志。我知道它没有段错误或任何东西,因为我编写了一个回溯函数,该函数打印程序访问的最后 10 个地址。那么是不是意味着程序发现没有子进程后就退出了循环呢?还是这里有什么险恶的东西在起作用?
c - 在 C 中运行/暂停子进程?
我在 C 中运行子进程,我想暂停然后运行同一个子进程。不太确定如何更好地描述我的问题,因为我是新手,但这里有一个镜头。
所以我知道你可以在另一个进程退出后使用waitpid
. 但是,如果我正在等待的进程在创建等待的进程时不存在怎么办。因此,在这种情况下,我正在考虑暂停执行等待的进程,当创建等待的进程然后完成时,它将调用执行等待的进程再次运行。那么你会怎么做呢?同样,我对此并不熟悉,所以我不知道这是否是正确的方法。
编辑:我想要做什么
我正在使用子进程execvp()
并行运行命令,所以如果我有一个序列sleep 1; sleep 1;
,总睡眠时间将为 1 秒。但是,在某些情况下,我尝试并行echo blah > file; cat < file;
,在这种情况下,我假设在将blah 输入cat
文件后读取文件。echo
因此,我必须等待echo
完成才能完成cat
。对此有更多细节,但通常假设对于任何具有文件输出的命令,必须由稍后在脚本中读取文件的任何命令等待。
linux - Bash:等待超时
在 Bash 脚本中,我想做类似的事情:
即,在后台启动两个应用程序,并给它们 60 秒的时间来完成它们的工作。然后,如果他们没有在那个间隔内完成,杀死他们。
不幸的是,上面的方法不起作用,因为timeout
它是一个可执行文件,而wait
它是一个 shell 命令。我尝试将其更改为:
但这仍然不起作用,因为wait
只能在同一个 shell 中启动的 PID 上调用。
有任何想法吗?
c - Unix-Waitpid '状态'
我正在使用 C 语言开发 Unix-Shell。我使用 waitpid 来等待我的进程终止,我想知道我的子进程(使用 创建fork()
)是否收到了类似SIGSEGV
.
当前代码:
xwaitpid
在父进程中调用。
似乎 WIFSIGNALED 总是返回 TRUE,即使我执行类似false || true
.
有人有一个好主意可以帮助我吗?
-> 找到我的答案,谢谢。
c - 等待子进程
这是我正在运行的程序的一个片段,但纠正它的机器会尝试这样做:
预期的输出是:
但是我的程序会打印随机数量的等待(像这样):
这是代码:
我认为问题在于内部有waitpid,这会产生很多等待。但是,如果我删除它并单独留下 waitpid,我会收到以下输出:
有没有办法只打一个等待电话而不会出现该错误?
fork - 使用 waitpid 分叉输出
上面的代码询问可能的输出是什么?
我发现,acbc、abcc、bacc 但答案包括 bcac。bcac 怎么可能是一个答案?父进程是在子进程创建之前退出还是某事。别的?我很困惑,欢迎任何解释。
谢谢。
perl - 从 Perl 中获取子进程
我有一个产生一组孩子的脚本。父母必须等待每个孩子完成。
我的脚本执行类似于以下 perl 脚本:
与我上面提供的代码类似,每个孩子可能需要不同的时间来完成。
问题是当我尝试通过遍历子 PID 来获取子时,在最后一个foreach
块中,父级按照子级的创建顺序等待子级。
显然,孩子们并没有按照他们产生的顺序完成,所以我留下了一堆僵尸进程,这些孩子碰巧提前完成了。
在我的实际代码中,这些孩子可能会提前几天完成,并且漂浮的僵尸进程的数量可能会增长到数百个。
有没有更好的方法让我收获一组孩子?
c++ - 使用 waitpid 等待另一个进程的线程
我正在尝试waitpid()
用于等待单个线程而不是进程。我知道pthread_join()
或者std::thread::join()
是等待线程的典型方式。然而,在我的例子中,我正在开发一个监控应用程序,它派生并执行(通过execv
)一个程序,该程序反过来又产生一些线程。因此,我无法从监控应用程序中加入线程,因为它们属于不同的进程并且我无权访问源代码。不过,我希望能够等待这些单独的线程完成。
为了更容易地可视化我想要实现的目标,我附上了一张图,希望让它更清晰:
当我使用进程时一切正常,但waitpid
不等待线程。基本上,在它被调用后立即waitpid
返回-1
(此时线程仍在运行几秒钟)。
国家文件waitpid
:
在 Linux 内核中,内核调度的线程不是与进程不同的构造。相反,线程只是一个使用 Linux 独有的 clone(2) 系统调用创建的进程;其他例程,例如可移植的 pthread_create(3) 调用是使用 clone(2) 实现的。在 Linux 2.4 之前,线程只是进程的一种特殊情况,因此一个线程不能等待另一个线程的子线程,即使后者属于同一个线程组。然而,POSIX 规定了这样的功能,从 Linux 2.4 开始,一个线程可以并且默认情况下会等待同一线程组中其他线程的子线程。
该描述仅考虑从一个线程等待其他线程的子线程(在我的情况下,我想等待另一个进程的线程子线程)。但是,至少,它表明这waitpid
是线程感知的。
这就是我用来等待线程的方法:
此代码适用于等待进程,但等待线程失败(即使使用了__WALL
标志)。
我想知道是否真的可以使用waitpid
. 我还需要使用其他标志吗?您能否指出任何解释如何等待另一个进程的线程的文档?
作为参考,我用于创建线程的代码是:
我正在使用 GCC 4.6 和 Ubuntu 12.04。
更新:我设法通过使用使其工作ptrace
:
此代码在 T1、T2、...、Tn 是进程和线程时都有效。
但是,我有一个问题。如果我在多线程 C++ 应用程序中尝试使用此监控工具,一切正常。但最初的意图是将此监视工具用于生成多个线程的 Java 应用程序。当使用多线程 Java 应用程序时,waitpid
in 循环每秒唤醒多次(子线程被 SIGSEGV 信号停止)。这似乎与 Java 出于自己的目的使用 SIGSEGV 的事实有关(请参阅此问题和此帖子)。
所有这些唤醒最终都会大大降低应用程序的速度。所以我想知道我的解决方案是否存在一些缺陷,以及是否有办法让它与 Java 应用程序一起使用。