해결해야 할 문제가 있습니다. 프로세스의 일부 스레드가 동기식 시스템 호출을 수행하고 있는데, 즉시 인터럽트하려고합니다. 이 문제를 해결하기 위해 pthread_kill
에 의해 신호를 보낼 수 있습니다.이 신호는 EINTR
과 함께 반환되어야합니다. 나는 이것을 설명하는 코드의 조각했다 :시스템 호출 중단
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/select.h>
#include <unistd.h>
#define SIG SIGALRM
int work = 1;
void signal_action(int signal)
{
fprintf(stderr, "%s caught\n", strsignal(signal));
}
void* thread_routine(void* arg)
{
struct sigaction sa;
sa.sa_handler = signal_action;
if(sigaction(SIG, &sa, NULL) < 0)
{
fprintf(stderr, "sigaction failed with %d (%s)\n", errno, strerror(errno));
return NULL;
}
fprintf(stderr, "Thread working\n");
while(work)
{
int rc = select(0, NULL, NULL, NULL, NULL);
if(rc < 0)
{
fprintf(stderr, "Select error: %d (%s)\n", errno, strerror(errno));
}
else
{
fprintf(stderr, "Select return %d\n", rc);
}
}
}
int main(int argc, char** argv)
{
pthread_t handle;
int rc = pthread_create(&handle, NULL, thread_routine, NULL);
if(rc != 0)
{
fprintf(stderr, "pthread_create failed with %d (%s)\n", rc, strerror(rc));
return 1;
}
sleep(1);
work = 0;
rc = pthread_kill(handle, SIG);
if(rc != 0)
{
fprintf(stderr, "pthread_kill failed with %d (%s)\n", rc, strerror(rc));
return 1;
}
rc = pthread_join(handle, NULL);
if(rc != 0)
{
fprintf(stderr, "pthread_join failed with %d (%s)\n", rc, strerror(rc));
return 1;
}
return 0;
}
을하지만 그것은 다른 방법을 작동하지 않습니다 같은 날, 더미 기능 (signal_action)를 정의 할 수 있습니다. 그럼, 2 질문 :
또 다른 스레드에서 시스템 호출을 중단하는 또 다른 옵션이 있습니까?
위와 같은 방법으로 더미 구조를 사용하지 않으려면 어떻게해야합니까?