[英]fork and signal: how to send signals from parent process to specific child process
[英]Parent process is firing signals at a child process but the child's signal handling needs to be improved
我正在為考試准備一些練習題,其中一個題為兩段代碼,稱為parent.c和child.c。 父級創建一個子級並向其發射信號,並且子級每次收到信號時都會顯示一條消息。 兒童將花費剩余的時間從主打印消息。 問題是描述child.c中的信號處理出了什么問題,並重新編寫代碼以對其進行更正。 我對信號有一個大致的了解,但是在實現它們方面有很多困難。 我不確定child.c中的procmask
是否能正常工作,我對信號不完全滿意,但是我看不到為什么將NULL
作為最后一個參數,所以這也許是錯誤原因的一部分? 有人可以指出正確的方向,讓我知道代碼的哪一部分是錯誤的,為什么。
父母
#include <unistd.h>
#include <signal.h>
int
main(int argc, char *argv[])
{
pid_t pid;
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGUSR1);
sigprocmask(SIG_BLOCK, &set, NULL);
pid = fork();
if (pid == 0) {
execlp("./child", "./child", NULL);
}
while (1) {
kill(pid, SIGUSR1);
}
return (0);
}
兒童
#define _XOPEN_SOURCE 500
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
static void
handler(int signo)
{
printf("This is the SIGUSR1 signal handler!\n");
}
int
main(void)
{
sigset_t set;
sigemptyset(&set);
sigset(SIGUSR1, handler);
sigprocmask(SIG_SETMASK, &set, NULL);
while (1) {
printf("This is main()!\n");
}
return (0);
}
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
最后一個參數用於存儲舊的信號掩碼。 如果為NULL
,則意味着我們不需要存儲舊的信號掩碼。
請注意,您不應在信號處理程序中使用printf
,因為它不會重入,請參閱如何避免在信號處理程序中使用printf?
execlp
的用法是錯誤的,因為NULL
可以定義為0
,並且編譯器可能認為它是整數,而不是null指針。
execlp("./child", "./child", NULL);
最后一個參數應為(char *)0
,如下所示:
execlp("./child", (char *)0);
正如man sigset
所述, sigset
已過時,您應該使用sigaction
。 這是有關如何使用它的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.