我想在使用自定義處理程序的多個進程之間發送SIGUSR1/SIGUSR2信號,但是我的處理程序不起作用。它不打印任何調試消息或任何東西。使用sigaction在Linux中的信號處理程序(C++)
我在這裏創建8個進程,並試圖用set_sigaction功能設置自定義處理程序:
int main(){
pidArray = (int *)mmap(NULL, MMAP_SIZE, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);//Self pid
pidArray2 = (int *)mmap(NULL, MMAP_SIZE, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);//Child pid
counter = (int *)mmap(NULL, MMAP_SIZE2, PROT_READ | PROT_WRITE,MAP_ANONYMOUS | MAP_SHARED, -1, 0);
counter[0]=0;
counter[1]=0;
pid_t pid, pid2;
int counter = 1;
pidArray[0]=getpid();
pid = fork(); //1
if(pid == 0){
pid = fork(); //2
if(pid != 0){
pidArray[1]=getpid();
pidArray2[1]=pid;
}
if(pid == 0){
pid2 = getpid();
pidArray[2]=pid2;
pid=fork(); //4
if(pid == 0){
pidArray[4] = getpid();
pid=fork(); //5
if(pid==0){
pidArray[5] = getpid();
pidArray2[5] = 0;
}
else
pidArray2[4] = pid;
}
if(pid2 == getpid()){
pid2 = fork(); //3
if(pid2!=0){
pid = setpgid(pid,pid2);
}
else{
pidArray[3]=getpid();
pid=fork(); //6
if(pid==0){
pidArray[6]=getpid();
pid=fork(); //7
if(pid==0){
pidArray[7]=getpid();
pid=fork(); //8
if(pid!=0)
pidArray2[7]=pid;
else{
pidArray[8]=getpid();
pidArray2[8]=pidArray[1];
}
}
else
pidArray2[6]=pid;
}
else
pidArray2[3]=pid;
}
}
}
}
set_sigaction(SIGUSR1);
sleep(5);
if(getpid()==pidArray[1])
kill(pidArray[0],SIGTERM);
if(getpid()==pidArray[1]){
send_signal(pidArray[1]);
}
sleep(100);
return 0;
這裏是set_sigaction功能:
static int set_sigaction(int signo)
{
struct sigaction sa;
memset(&sa, 0, sizeof(struct sigaction));
sa.sa_sigaction = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
return sigaction(signo, &sa, NULL);
}
這裏是處理:
static void handler(int signo, siginfo_t* si, void* ucontext){
int k;
int i;
pid_t pid = getpid();
for(i=1;i<9;i++){
if(pidArray[i]==pid)
k=i;
}
time_t rawtime;
time (&rawtime);
cout << k << " " << pid << " Got USR1 " << ctime (&rawtime) << "\n";
send_signal(getpid());
}
我的send_signal函數給了我這個消息,這意味着它發送SIGUSR1 si gnal到第二個過程:
1 3156發送USR1週四6月22日18時04分54秒2017年
我想這個問題是我如何創建多個進程或如何設置我的處理程序。
你應該小心與POSIX信號:當消防信號,它可以中斷一切(甚至內核調用)。這意味着,在處理信號時,您可能處於不正確的狀態,您可能會遇到數據競爭......在信號處理程序中,您應該儘可能快地出去,並且您應該儘可能多地進行操作效果(如I/O)。 – nefas
感謝您的建議,但是如果我的處理程序只有一條調試消息。它仍然不會打印它。 – Dmitry
''send_signal''做些什麼? – nefas