2012-09-05 45 views
1

在我的項目殺人,我需要一個子任務並行與父任務中發揮。我使用fork()來創建一個並行進程,它是aplay xyz.wav。現在,當我想要從父進程中終止子進程,例如system("kill -9 aplay ")時,aplay被終止,但是我看到了父任務的兩個實例。我認爲其中一個是通過調用fork()創建的副本,另一個是原始的。隨着每次fork()調用,副本數量都會增加。我意識到內存溢出。我只是想保持原來的過程。我試圖殺死父母的副本,但失敗了!父母程序的副本顯示爲'不存在'。fork()和在Linux

的「defucnt」過程繼續增加,因爲我打電話並行處理,i是否殺死aplay與否。我也嘗試通過其PID來殺死它,但它也沒有工作。

static int 
test(Core *pc, char *args) 
{ 


pid1=fork(); 
if (pid1 ==0) 
{ 
     system ("ps "); 
     system("aplay /opt/Line_Tone_14s.wav"); 

     _exit(0); 
} 
else if(pid1<0) 
{ 
out("fork() ERROR (-1) returned\n"); 
} 
else if(pid1>0) 
{ 
out("I AM IN PARENT PROCESS() NOW\n"); 
} 
return 1; 

} 

static int 
test1(Core *pc, char *args) 
{ 
system ("ps "); 
system ("killall -9 aplay "); 
return 1; 

}

Initially 

> PID TTY   TIME CMD 
1580 pts/0 00:00:00 sudo 
1581 pts/0 00:00:00 su 
1589 pts/0 00:00:00 bash 
5732 pts/0 00:00:00 parent 
5738 pts/0 00:00:00 sh 
5739 pts/0 00:00:00 ps 

>test 
> PID TTY   TIME CMD 
1580 pts/0 00:00:00 sudo 
1581 pts/0 00:00:00 su 
1589 pts/0 00:00:00 bash 
5732 pts/0 00:00:00 parent 
5737 pts/0 00:00:00 parent 
5740 pts/0 00:00:00 sh 
5741 pts/0 00:00:00 aplay 
5743 pts/0 00:00:00 sh 
5744 pts/0 00:00:00 ps 


>test1     
>killed 

after kill 
>PID TTY   TIME CMD 
1580 pts/0 00:00:00 sudo 
1581 pts/0 00:00:00 su 
1589 pts/0 00:00:00 bash 
5732 pts/0 00:00:00 parent 
5737 pts/0 00:00:00 parent <defunct> 
5753 pts/0 00:00:00 sh 
5754 pts/0 00:00:00 ps 

>test 
> PID TTY   TIME CMD 
1580 pts/0 00:00:00 sudo 
1581 pts/0 00:00:00 su 
1589 pts/0 00:00:00 bash 
5732 pts/0 00:00:00 parent 
5737 pts/0 00:00:00 parent <defunct> 
5759 pts/0 00:00:00 parent 
5762 pts/0 00:00:00 sh 
5763 pts/0 00:00:00 aplay 
5765 pts/0 00:00:00 sh 
5766 pts/0 00:00:00 ps 

>test1 
>killed 

after kill 

>PID TTY   TIME CMD 
1580 pts/0 00:00:00 sudo 
1581 pts/0 00:00:00 su 
1589 pts/0 00:00:00 bash 
5732 pts/0 00:00:00 parent 
5737 pts/0 00:00:00 parent <defunct> 
5759 pts/0 00:00:00 parent <defunct> 
5773 pts/0 00:00:00 sh 
5774 pts/0 00:00:00 ps 

我還測試()命令與此嘗試

else if(pid1>0) 
{ 
    out("I AM IN PARENT PROCESS() NOW\n"); 
wait(&status); 
} 

通過這樣做,只有一個父進程保持後aplay完成播放聲音,無論怎樣很多時候我稱之爲「測試」命令。但問題在於,我無法在聲音播放期間輸入任何其他命令,直到完成。所以不能在播放聲音之間殺死它。

我想播放聲音並行,並想殺死任何時候我想要的。

回答

5

不要這樣殺死它!您有pid1中的子PID,只需使用kill()函數即可將其終止。

產卵一個單獨的進程中運行killall是不必要的,昂貴的,(如你發現了),不可靠的。那麼如果有五個那個可執行文件的副本在運行?在你的父母

#include <sys/types.h> 
#include <signal.h> 
: 
int rc = kill (pid1, 9); // or SIGKILL for portability, rather than 9. 
// Check rc and errno. 

您可以使用類似。

我也認真考慮刪除的子進程system電話,以及因爲他們開始了獨立的進程。您可以使用exec系列調用替代該程序在子進程空間中做得更好。

+2

我會用'SIGKILL'而不是'9' ... :-)但無論如何+1,簡單到如此地步。 –

+0

採取的措施@R ..補充說,作爲評論。 – paxdiablo

+0

我們已經試過殺死,sigkill也。 –