[英]fork and signal: how to send signals from parent process to specific child process
我需要fork
兩個子進程。 一個可以接收信號3,打個hello
然后將信號4發送給另一個子進程。 另一個可以接收信號4,打印world
並將信號3發送到第一個子進程。
首先,父進程將在睡眠3秒鍾后將信號3發送到第一個子進程。
然后3秒后,父進程將發送SIGKILL
殺死他們兩個。
我不知道如何向特定的子進程發送信號(我知道我們有一個函數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;
}
當您fork
會得到新的pid
。 每個kill聯機幫助頁都稱為kill(pid_t pid, int sig);
使用pid
您可以使用popen()函數通過分叉並打開該進程的管道來打開該進程(而不是直接使用fork())
父級知道每個進程的PID,因此可以輕松地將第二個孩子的pid傳遞給第一個孩子。
第一個孩子可以使用pid和kill()函數將信號傳遞給第二個孩子。
因此,使用popen()啟動第一個孩子。 使用fork()啟動第二個孩子,然后通過popen()創建的流將pid從第二個孩子傳遞到第一個孩子。
從fork()調用返回的pid值的處理未正確處理。
發布的代碼假設對fork()的調用已成功...這不是一個安全/有效的假設
該代碼還需要檢查pid是否為-1並適當地處理該錯誤。
當子進程完成時,它不應該坐在while()
循環中,而應該使用exit()
函數exit()
。
父進程不應僅退出,因為這會使兩個子進程成為僵屍。 (如果不重新啟動系統,僵屍很難擺脫。)
相反,父級應該調用wait()
甚至更好的waitpid()
(並記住子進程需要實際退出,而不是坐在while()
循環中。
1) func()
和func2()
應該檢查參數以確保它是正在處理的正確信號。
2) signal()
)的手冊頁指示不應使用它。 手冊頁建議使用: sigaction()
,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.