2014-11-12 3 views
1

해결해야 할 문제가 있습니다. 프로세스의 일부 스레드가 동기식 시스템 호출을 수행하고 있는데, 즉시 인터럽트하려고합니다. 이 문제를 해결하기 위해 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 질문 :

  • 또 다른 스레드에서 시스템 호출을 중단하는 또 다른 옵션이 있습니까?

  • 위와 같은 방법으로 더미 구조를 사용하지 않으려면 어떻게해야합니까?

답변

0

당신은 스레드 간의 다른 동기화 mechanismes를 사용할 수 있지만 차단 시스템 호출을 중단 원하는대로, 나는 pthread_kill 다른 무언가를 상상할 수 없다.

그리고 기본값은 신호를 완전히 무시하고 원치 않으므로 전체 프로그램을 중단하고 그 중 하나를 원하지 않으므로 명시 적으로 signal_action을 사용해야합니다. 그래서 아니오, 명시 적으로 signal_action을 피할 방법을 상상할 수는 없습니다.