그래서 OS X과 Linux 모두에서 작동하는 pthreads를 사용하여 신호 처리기를 만들려고합니다. 아래 코드는 OS X에서 작동하지만 Fedora 13에서는 작동하지 않습니다.sigwait in Linux (Fedora 13) vs OS X
응용 프로그램은 매우 간단합니다. 그것은 pthread를 생성하고 SIGHUP을 등록하고 신호를 기다립니다. 시그널 핸들러를 생성 한 후에 나는 시그널이 signal_handler 쓰레드로 보내 져야만하기 때문에 메인 쓰레드에서 SIGHUP을 막는다.
OS X에서 컴파일이되면 실행하고 SIGHUP을 프로세스에 보내면 "SIGHUP"이 인쇄됩니다. 리눅스에서는 그냥 프로세스를 죽이고 Hangup을 출력한다. signal_handler pthread_create를 주석 처리하면 응용 프로그램이 죽지 않습니다.
나는 응용 프로그램이 sigwait과 블록에 도착하지만 신호 코드를 반환하는 대신 응용 프로그램을 죽이는 것을 알고 있습니다.
g++ test.cc -lpthread -o test
./test &
PID="$!"
sleep 1
kill -1 "$PID"
test.cc
#include <pthread.h>
#include <signal.h>
#include <iostream>
using namespace std;
void *signal_handler(void *arg) {
int sig;
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGHUP);
while (true) {
cout << "Wait for signal" << endl;
sigwait(&set, &sig);
if (sig == SIGHUP) {
cout << "Got SIGHUP" << endl;
}
}
}
int main() {
pthread_t handler;
sigset_t set;
// Create signal handler
pthread_create(&handler, NULL, signal_handler, NULL);
// Ignore SIGHUP in main thread
sigfillset(&set);
sigaddset(&set, SIGHUP);
pthread_sigmask(SIG_BLOCK, &set, NULL);
for (int i = 1; i < 5; i++) {
cout << "Sleeping..." << endl;
sleep(1);
}
pthread_join(handler, NULL);
return 0;
}
위대한 작품에 감사드립니다. – Silas