在C中运行/暂停子进程?

时间:2012-02-03 20:33:06

标签: c process fork blocking waitpid

我在C中运行子进程,我想暂停然后运行相同的子进程。我不确定如何以更好的方式描述我的问题,因为我是新手,但这里是一个镜头。

所以我知道您可以使用waitpid在另一个进程退出后运行一个进程。但是,如果我正在等待的过程在创建等待的过程中不存在。所以在这种情况下,我正在考虑暂停执行等待的进程以及何时创建等待的进程然后完成,它将调用等待再次运行的进程。那你怎么做?再说一次,我对此并不熟悉,所以我不知道这是否是正确的方法。

编辑:我正在尝试做什么

我正在使用子进程并行地通过execvp()运行命令,所以如果我有序列sleep 1; sleep 1;,则总休眠时间将为1秒。但是在某些情况下,我尝试并行echo blah > file; cat < file;,在这种情况下我假设catecho输入blah到文件后读取文件。因此,我必须等echo完成cat。有更多细节,但通常假设任何带有输出到文件的命令都必须由稍后在脚本中读取文件的任何命令等待。

2 个答案:

答案 0 :(得分:1)

在Linux中:您可以在alarm()之前设置waitpid(),这样您就可以在一定的秒数后唤醒,waitpid()应该返回EINTR,这样您就可以知道情况并且可以杀死行为不端的人。另一种方法是在等待过程中使用互斥锁并使用这样的块:

if (pthread_mutex_trylock(&mutex) {
  sleep(some seconds);
  if (pthread_mutex_trylock(&mutex) {
    kill the process
  }
}

以及受监控的流程:

入口点:

pthread_mutex_lock(&mutex);
do_stuff();
pthread_mutex_unlock(&mutex);

答案 1 :(得分:0)

任何应用程序(进程)只能在自己的直接子进程上等待waitpid()。它不能等待孙子或更远的后代,它既不能等待兄弟姐妹也不能等祖先,也不能等待不相关的过程。

如果您的应用程序是单线程的,那么您不能等待waitpid()调用启动后创建的进程,因为没有必要创建子进程所需的fork()

在多线程进程中,您可以让一个线程等待死亡的孩子,另一个线程可以创建子级。例如,您可以在时间T0开始线程1中的waitpid()调用,然后让线程2在T1(T1> T0)创建子项,然后子项在T2处死亡,{{{即使孩子是在waitpid()开始之后创建的,也会在T3处接收孩子的尸体。

您的更高级别的问题可能不完全易处理。您无法通过检查“shell脚本”中的命令行来确定哪些进程正在访问给定文件。您可以看到可能正在使用它的那些(因为文件名出现在命令行中);但是可能有其他进程将名称硬连接到它们中,并且通过检查命令行无法看到它。