2012-02-03 144 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腳本'中的命令行來判斷哪些進程正在訪問給定的文件。你可以看到那些可能正在使用它的人(因爲文件名出現在命令行中);但可能會有其他進程將其名稱硬連接到它們中,並且您無法通過檢查命令行來查看該進程。