2012-02-03 99 views
2

我正在C中运行子进程,我想暂停然后运行相同的子进程。由于我是新手,所以不太确定如何更好地描述我的问题,但这里有一个镜头。在C中运行/暂停子进程?

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

编辑:我试图

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

+0

你的外在问题是什么?为什么你甚至需要一个等待的过程? – 2012-02-03 20:35:08

+1

当你调用fork()时你得到PID;如果您还没有看到Beej指南,我会建议您这样做:http://beej.us/guide/bgipc/output/html/multipage/fork.html如果您需要知道孩子何时完成,那么您需要某种类型的IPC。 – EdH 2012-02-03 20:36:36

+0

这是操作系统相关的,它不是标准C的一部分,所以你需要对你写的东西更具体些。我假设*尼克斯。 – 2012-02-03 20:36:52

回答

1

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

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

和在被监控的过程:

ENTRY-POINT:

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

的任何应用程序(过程)只能等待waitpid()自己的直接子女。它不能等待孙辈或更远的后代,它可以等待兄弟姐妹,祖先和无关的过程。

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

在多线程的过程中,您可以让一个线程等待死亡的孩子,另一个线程可以创建孩子。例如,你可以让线程1中的waitpid()调用在时间T0开始,然后让线程2在T1(T1> T0)创建一个子进程,然后子进程在T2结束,并且waitpid()将拾起尸体T3的孩子,即使孩子是在waitpid()开始后创建的。

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