[英]SIGTSTP signal handler for child process
因此,我正在嘗試在子進程中為SIGTSTP信號實現信號處理程序。
基本上我想要達到的是:
我使用以下命令運行它:./testsig sleep 10
到目前為止,這是我的代碼:
#include<stdlib.h>
#include<stdio.h>
#include<signal.h>
#include<string.h>
volatile sig_atomic_t last_proc_stopped;
volatile sig_atomic_t parent_proc_id;
void handle_stp(int signum)
{
if(getpid()==parent_proc_id)
{
kill(parent_proc_id,SIGCONT);
signal(SIGTSTP,handle_stp);
}
else
{
last_proc_stopped=getpid();
kill(parent_proc_id,SIGCONT);
}
}
void main(int argc, char *argv[])
{
int childid=0,status;
signal(SIGTSTP,SIG_IGN);
parent_proc_id=getpid();
childid=fork();
if(childid>=0)
{
if(childid==0)//child
{
signal(SIGTSTP,handle_stp);
strcpy(argv[0],argv[1]);
strcpy(argv[1],argv[2]);
argv[2]=NULL;
printf("Passing %s %s %s\n",argv[0],argv[1],argv[2]);
execvp(argv[0],argv);
}
else
{
wait(&status);
printf("Last Proc Stopped:%d\n",last_proc_stopped);
}
}
else
{
printf("fork failed\n");
}
}
目前,ctrl + Z似乎具有某種效果(但絕對不是我想要的效果!)
當我在執行睡眠的孩子中間按下ctrl + Z時,光標會繼續閃爍剩余的時間(在我的情況下為10秒),但是控件沒有到達父進程。
在不按Ctrl + Z的情況下,控件將按預期方式返回到父級。
我究竟做錯了什么?
我也已經看到了這個答案,但是我真的不能理解它:
您有兩個過程:
忽略信號的父母
設置了處理程序的子進程將執行另一個進程-這將從內存中清除信號處理程序的代碼(執行的程序將代替調用進程而加載),因此也將清除信號設置。 因此,您的信號處理函數將永遠不會被調用。 是否可以向處理程序發出信號,使其在執行“ exec”之后繼續生存?
您可以做什么來實現自己的目標?
父母應該忽略這個信號,
子級應保留默認的信號處理功能(這將停止處理),
父級應使用waitpid()
來查看子進程是否已退出或已停止,並采取相應措施(這實際上是殺死已停止的子進程)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.