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

在C中运行/暂停子进程?,c,process,fork,blocking,waitpid,C,Process,Fork,Blocking,Waitpid,我正在C中运行子进程,我想暂停,然后运行同一个子进程。我不太确定如何更好地描述我的问题,因为我是新手,但这里有一个机会 因此,我知道您可以使用waitpid在另一个进程退出后运行一个进程。但是,如果我正在等待的进程在进行等待的进程的创建时不存在呢。因此,在本例中,我考虑暂停执行等待的进程,当创建等待的进程并完成后,它将调用执行等待的进程再次运行。那么你会怎么做呢?再说一遍,我不熟悉这个,所以我不知道这是否是正确的方法 编辑:我想做什么 我使用子进程通过execvp()并行运行命令,所以如果我有一

我正在C中运行子进程,我想暂停,然后运行同一个子进程。我不太确定如何更好地描述我的问题,因为我是新手,但这里有一个机会

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

编辑:我想做什么


我使用子进程通过
execvp()
并行运行命令,所以如果我有一个序列
sleep 1;睡眠1,总睡眠时间为1秒。然而,在有些情况下,我尝试并行
echo blah>文件;cat
在这种情况下,我假设
cat
echo
向文件中输入blah之后读取文件。因此,我必须等待
echo
完成
cat
。这方面有更多的细节,但通常假设,对于任何输出到文件的命令,脚本中稍后读取文件的任何命令都必须等待。

在Linux中:您可以在
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);
任何应用程序(进程)只能在自己的直接子级上使用
waitpid()
等待。它不能等待孙子或更远的后代,它既不能等待兄弟姐妹,也不能等待祖先,也不能等待不相关的过程

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

在多线程进程中,一个线程可能在等待即将死亡的子线程,而另一个线程可能正在创建子线程。例如,您可以让线程1中的
waitpid()
调用在时间T0开始,然后让线程2在T1(T1>T0)创建一个子线程,然后子线程在T2死亡,
waitpid()
将在T3拾取子线程的尸体,即使子线程是在
waitpid()
启动之后创建的


你更高层次的问题可能不是完全可以处理的。您不能仅仅通过检查“shell脚本”中的命令行来判断哪些进程正在访问给定的文件。您可以看到那些可能正在使用它的人(因为文件名显示在命令行上);但是,可能还有其他进程将名称硬连接到它们中,而您通过检查命令行无法看到这一点。

您的外部问题是什么?为什么您甚至需要一个进程来等待呢?当您调用fork()时,就会得到PID;如果你没有看过Beej指南,我会建议你:如果你需要知道孩子什么时候完成,那么你需要某种IPC。这是操作系统相关的,不是标准C的一部分,所以你需要更具体地说明你在写什么。我假设*nix.@KeithNicholas fork()仅在类UNIX系统上可用,所以肯定是这样。