我有一个问题,这是因为我执行了这两个代码,第二个在我执行它时关闭了终端,第一个因此被阻止。
第一个代码:
#include <signal.h>
#include <pthread.h>
#include <stdio.h>
#define N 10 // Numero de plazas disponibles en total
int POcupadas;
int main(){
POcupadas = 0;
int sig;
union sigval user_sigval;
sigset_t sigset;
siginfo_t siginfo;
sigemptyset(&sigset);
sigaddset(&sigset, SIGRTMIN);
pthread_sigmask(SIG_BLOCK, &sigset, NULL);
while(1){
sig=sigwaitinfo(&sigset, &siginfo);
int pid = siginfo.si_value.sival_int;
if (sig!=-1){
if (POcupadas != N){
++POcupadas;
user_sigval.sival_int = 0;
sigqueue(pid, SIGRTMIN+1, user_sigval);
}else{
user_sigval.sival_int = 1;
sigqueue(pid, SIGRTMIN+1, user_sigval);
break;
}
}else{
printf("Error");
}
}
return 0;
}
第二个代码:
#include <signal.h>
#include <stdio.h>
#include <pthread.h>
int main () {
int sig;
srand(time(NULL));
sigset_t set;
siginfo_t siginfo;
union sigval user_sigval;
int i, num;
sigemptyset(&set);
sigaddset(&set,SIGRTMIN+1);
pthread_sigmask(SIG_BLOCK, &set, NULL);
// PID
int pid = 5845;
// PID
for(i=0; i<30; i++) {
user_sigval.sival_int = getppid();
sigqueue(pid, SIGRTMIN, user_sigval);
sig=sigwaitinfo(&set, &siginfo);
if (siginfo.si_value.sival_int == 0){
printf ("Continue executing the code.\n");
}else{ // No hay sitio 1
printf ("Finish executing the code.\n");
break;
}
sleep(1);
}
return 0;
}
这是为什么呢?我做错了什么?
最佳答案
看起来你是在为自己做这件事。考虑第二个代码的摘录:
user_sigval.sival_int = getppid();
sigqueue(pid, SIGRTMIN, user_sigval);
现在看第一段代码的中心部分:
sig=sigwaitinfo(&sigset, &siginfo);
int pid = siginfo.si_value.sival_int;
if (sig!=-1){
if (POcupadas != N){
++POcupadas;
user_sigval.sival_int = 0;
sigqueue(pid, SIGRTMIN+1, user_sigval);
}else{
user_sigval.sival_int = 1;
sigqueue(pid, SIGRTMIN+1, user_sigval);
break;
}
}else{
printf("Error");
}
假设运行第二个代码的进程(进程 2)成功地将其信号定向到运行第一个代码的进程(进程 1),进程 1 通过向其 PID 随信号传递的进程发出响应来响应。那是进程 2 的 parent(引用第二个代码摘录中的 getppid()
)。实时信号的默认处理是进程终止。
您可能希望进程 2 随信号发送自己的 PID;拼写为 getpid()
。
关于发送信号的代码,其中一个终端关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28117306/