簡體   English   中英

fork and signal:如何將信號從父進程發送到特定的子進程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM