2017-01-09 169 views
0

我需要fork兩個子進程。人們可以接收到信號3,打印hello並將信號4發送給另一個子進程;另一個可以接收信號4,打印world並將信號3發送給第一個子進程。
要開始,父進程會在睡眠3秒後將信號3發送到第一個子進程。
然後3秒鐘後,父進程將發送SIGKILL殺死他們兩個。
fork和信號:如何從父進程發送信號到特定子進程

我不知道如何發送信號到一個特定的子進程(我知道我們有一個功能kill發送信號,但我不知道在這裏使用它)。

這裏是我的代碼:

#include <stdio.h> 
#include <signal.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <stdlib.h> 

void func(int n) 
{ 
     printf("ping\n"); 
     // how to send signal 4 to the second process? 
} 

void func2(int n) 
{ 
     printf("pong\n"); 
     // how to send signal 3 to the first process? 
} 

int main() 
{ 
     pid_t pid; 
     int i; 
     for(i = 0; i < 2; i++) 
     { 
       pid = fork(); 
       if(pid == 0) 
       { 
         if(i == 0) 
         { 
           signal(3, func); 
         } 
         else 
         { 
           signal(4, func2); 
         } 
         while(1); 
       } 
       else 
       { 
         if(i == 1) 
         { 
           sleep(3); 
           // how to send signal 3 to the first child process? 
           sleep(3); 
           // how to kill the two children? 
         } 
       } 
     } 


     return 0; 
} 
+1

在信號上下文中調用'printf()'的未定義行爲。 – EOF

+0

http:// man7。org/linux/man-pages/man2/kill.2.html – alk

+0

@EOF我應該怎麼做? – Yves

回答

0

您可以使用POPEN()函數分叉並打開一個管道,該進程(而不是使用fork()的直接)打開的過程

的父母都知道每個進程的PID可以很容易地將第二個孩子的PID傳遞給第一個孩子。

第一個孩子可以使用pid和kill()函數將信號傳遞給第二個孩子。

所以,使用popen()來啓動第一個孩子。使用fork()啓動第二個孩子,然後通過使用popen()創建的流將第二個孩子的pid傳遞給第一個孩子。

對調用fork()返回的pid值的處理沒有得到正確處理。

張貼的代碼作出假設調用fork()是成功的。這不是一個安全/有效的假設

代碼還需要檢查PID是-1,妥善處理那個錯誤。

當子進程完成時,它不應該坐在while()循環中,而應該使用exit()函數退出。

父母不應該只是退出,因爲這會將兩個子進程留作殭屍。 (殭屍都很難擺脫短期的系統重啓。)

相反,父母應該叫wait()甚至更​​好waitpid()(記住子進程需要真正退出,而不是在while()環坐。

1)func()func2()應檢查參數以確保它是正在處理的正確信號。

2)signal()的手冊頁表明不應該使用它。該手冊頁建議使用:sigaction(),

0

當你fork你得到新的pid。每kill manpage調用kill(pid_t pid, int sig);使用pid

+0

如果我在第一個「睡眠(3)」之後寫入'kill(pid,3)',我認爲它會發送給所有子進程。我需要的是發送到第一個子進程。 – Yves

+0

@Thomas:no;它會將信號發送到一個進程,除非您對'pid'使用零或負值。 –

+0

好的。我知道了。我還有一個問題:如何分享進程之間的pid?因爲我需要'func'中的'kill(4,secondProcessPid)'和'func2'中的'kill(3,firstProcessPid)'。如何獲得這兩個pid?我必須使用共享內存之類的東西嗎? – Yves