2013-02-10 113 views
3

什麼是正確的方式來告訴一個特定的過程睡覺? 我不完全理解如何控制我創建的不同過程。我想讓兩個進程睡眠2和3秒。當進程1休眠2秒,進程2仍然在休眠時,我想進程3開始休眠。但是,我如何讓一個過程入睡呢?或者不是嗎?創建一個進程並告訴它進入睡眠狀態?

int main(void) 
{ 
    pid_t p1 = fork(); 
    pid_t p2 = fork(); 
    pid_t p3 = fork(); 

    //make p1 sleep(2) and p2 sleep(3) 
    waitpid(p1, NULL, 0); //waiting for p1 to terminate 
    //make p3 sleep(2); 
} 

正如你所看到的,我不明白如何處理進程或者他們到底是什麼。我認爲它們是對象,但我猜這是錯誤的..我嘗試閱讀一些關於它的東西,但它們都超過9000頁的PDF ..對我應該看到它們的一個簡單的解釋將被讚賞。是的,這是學校教材,但不是,這不是一項任務。

回答

5

man fork開始,略短於9000頁。主要是成功的fork返回兩次:它返回0到子進程和孩子的PID到父進程。它通常像這樣使用:

pid_t pid = fork(); 
if (pid<0) { /* error while forking */ 
}; 
if (!pid) { /* code for child */ 
    play(); 
    whine(); 
    sleep(); 
    exit(0); 
} else { /* code for parent */ 
    grunt(); 
    waitpid(...); 
} 

你不正常告訴子進程做這做那,你只需要添加代碼,做給適當的if分支。

在你的榜樣,如果所有叉是成功的,你最終過程:

  1. 首先叉創建一個新的進程,p1在新的進程,並在家長的一些PID的收益爲0。
  2. 第二個分支在原始父級和子級中都被調用,爲圖片添加2個進程。 p2在所有「孫子」和兩個不同的PID在步驟2
  3. 第三叉被稱爲在不同過程之前存在2個進程得0,添加其他四個過程的圖片。
+0

哦!我現在明白了,謝謝! – Sti 2013-02-10 15:34:27

4

你可以發送一個SIGSTOP,然後SIGCONT我想。

kill(p1, SIGSTOP); 

或者多三立,因爲你只分叉,因此具有完全控制研究過的代碼,你可以處理的路徑:

if (in_child_1) 
    sleep(..); 

作爲一個方面說明,在您的代碼會創建比您預期更多的進程。一旦創建了p1從該點開始執行,與其父母並行執行。等等。

+0

因此,當其他子進程工作時,不能讓子進程「睡(i)」?是的,我之前注意到他們正在以指數方式來到我身邊,爲什麼呢?我想我必須在叉子上閱讀。 – Sti 2013-02-10 15:24:54

相關問題