2012-11-09 46 views
1

我有以下代码:如何在从“killall”或“kill -p pid”接收到kill信号时退出程序之前执行处理函数?

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

pthread_t test_thread; 

void *thread_test_run (void *v) 
{ 
    int i=1; 
    while(1) 
    { 
     printf("into thread %d\r\n",i); 
     i++; 
     sleep(1); 
    } 
    return NULL 
} 

int main() 
{ 

    pthread_create(&test_thread, NULL, &thread_test_run, NULL); 


    sleep (20); 


    pthread_cancel(test_thread); 

    sleep(100); 
    // In this period (before the finish of myprogram), 
    // I execute killall to kill myprogram 
    // I want to add a signal handle function to 
    // execute pthread_exit() before the program quit 

} 

我想通过将信号处理函数执行了pthread_exit()程序退出之前完成我的代码。

怎么办?

+2

见'人signal'和'男人sigaction'。给自己一脚,尝试一下,如果你不能向我们展示我们在哪里以及如何向我们展示,就回来。 – alk

回答

3

由于killall默认发送信号为SIGTERM,您可以处理这种类型的信号。

#include <signal.h> 

void handler(int sig) 
{ 
    /* ... */ 
} 

signal (SIGTERM, handler); 
+0

我在哪里放'signal(SIGTERM,处理程序);'?在main()'的开头? – MOHAMED

+0

是的,这将是一个好主意。从您设置处理程序的那一刻开始,它应该可以正常工作。 – md5

+0

你应该避免使用'signal'来代替使用sigaction – iabdalkader

2

这是我如何实现某种你想在我utilite什么https://github.com/seriyps/wrk/commit/1d3c5dda0d46f0e567f3bae793bb3ae182de9438

static thread *threads; 
int main(....){ 
    ... 
    sigint_action.sa_handler = &sig_handler; 
    sigemptyset (&sigint_action.sa_mask); 
    /* reset handler in case when pthread_cancel didn't stop 
     threads for some reason */ 
    sigint_action.sa_flags = SA_RESETHAND; 
    sigaction(SIGTERM, &sigint_action, NULL); 
    ... 
} 
static void sig_handler(int signum) { 
    printf("interrupted\n"); 
    for (uint64_t i = 0; i < cfg.threads; i++) { 
     if(pthread_cancel(threads[i].thread)) exit(1); 
    } 
} 
+0

调用函数不在列表中,http:// man7.org/linux/man-pages/man7/signal.7.html,在处理程序中是不安全的。 – 2501