2012-11-08 60 views
1

我想一個小單元測試在這裏。但該計劃不能按我的預期工作。現在fork()的殺()和execv()

char *args[2]; 
    args[0] = (char*)"/usr/bin/firefox"; 
    args[1] = NULL; 
    pid = fork(); 
    printf("forked and my pid is %d\n",pid); 
    //check for errors 
    if (pid<0){   
     printf("Error: invoking fork to start ss has failed, Exiting\n "); 
     exit(1); 
    } 
    //the child process runs firefox 
    if (pid==0){   
     if (execv(args[0],args)<0){ 
      perror("Error: running s with execvp has failed, Exiting\n"); 
     } 
     printf("IVE BEEN KILLED\n");    
    } 
    //dad is here 
    printf("DAD IS GOING TO KILL U\n"); 
    if (pid>0){ 
     sleep(3); 
     kill(get_pidof(string("firefox")),SIGUSR1); 
    } 

,我希望該程序如下運行:1. 孩子跑的Firefox(它一定支持) 2.爸爸打印爸會殺了U(到目前爲止好) 3. Firefox將打開3秒,然後關閉(也是如此) 4.子進程將完成運行execv並打印「IVE BE KILLED」。這不會發生。

我的目標是要知道哪些execv運行程序已經execv之後提出幾個標誌完成繼續運行(其中香港專業教育學院被殺害的printf是)。 我有一個幾千行代碼,不想使用其他方法,除非必要。

感謝

+0

我已經重新標記這是C.有沒有C++代碼中的例子可見一斑! – Rook

回答

2

execv()替換爲一個新的進程當前進程。當火狐通過execv()開始的printf("IVE BEEN KILLED\n")基本上不再在這個過程中存在,並且將永遠不會被執行(見man execv)。這將有可能對於父進程等待子,火狐,通過使用wait()退出或經由一個信號(例如signal(SIGCHLD, child_exit_handler))被提醒子進程的死亡。

+0

好的。當我手動關閉Firefox的UI時,它會打印IVE BEEN KILLED。 有沒有辦法讓代碼發生? –

+0

好的。當我手動關閉Firefox的UI時,它會打印IVE BEEN KILLED。 –

+0

@ user1432779,想必你的意思是_doesn't_ print'我已經被殺死了'。從子進程中可以做到這一點,因爲它是firefox,因此調用'execv()'之後的任何行都不應該被調用,除非失敗。唯一的辦法是讓父進程打印該行。 – hmjd

0

你殺了孩子,並沒有捕捉到信號,所以它只是死亡。至少如果高管回來了,但事實並非如此。所以如果exec失敗,你只能執行打印。

如果你想知道如果你的孩子已經完成,使用wait通話。

也要注意,當你的孩子沒有退出,它會再執行父PID的代碼,這可能是有趣的。

+0

但父親不能空閒,直到孩子死亡。它需要保持運行,進而最終會檢查是否標誌中提出,顯示了execv完成(或該進程execv開始已完成) –

+0

Oh..so殺沒殺原來的子進程,但打死Firefox取代它的過程? –

+0

@ user1432779,firefox是子進程。 – hmjd