0
문제가 있습니다.이 두 코드를 실행하고 두 번째 코드를 실행하면 터미널이 닫히고 첫 번째 코드는 그 때문에 차단됩니다.터미널 중 하나가 신호를 보내는 코드가 닫힙니다.
첫 번째 코드 :
#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;
}
입니까? 내가 도대체 뭘 잘못하고있는 겁니까?
신호를 보내고있는 프로세스의 PID를 하드 코딩하는 것은 매우 이상합니다. 프로세스 자체에 신호를 보내려면'getpid()'를 통해 자체 PID를 얻을 수 있습니다. '5845 '가 로그인 셸의 PID 일 경우, SIGRTMIN을 보내면 프로세스가 차단하거나 처리기를 설치하지 않는 한 그것을 죽일 가능성이 있습니다. 그것은 관찰 된 행동을 설명 할 수 있습니다. –