pthread_kill pthread_cancel
2013-01-09 11:14
573 查看
pthread_kill函数的功能是向指定线程发送信号,信号为0时用于检查此线程ID的线程是否存活。
pthread_cancel函数的功能是给线程发送取消信号,使线程从取消点退出。(http://baike.baidu.com/view/8517720.htm)
请在创建的线程中使用signal(SIGKILL,sig_handler)处理信号,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出。
Output:
Enter Testcase - QP0WTEST/TPTESTC0
Create thread using the NULL attributes
Entered secondary thread
Cancel the thread
Secondary thread is now looping
Secondary thread is now looping
Secondary thread is now looping
Secondary thread is now looping
Secondary thread is now looping
Cancel state set to ENABLE
Secondary thread is now looping
Inside cancellation cleanup handler
Main completed
(stevenliyong)
pthread_cancel函数的功能是给线程发送取消信号,使线程从取消点退出。(http://baike.baidu.com/view/8517720.htm)
请在创建的线程中使用signal(SIGKILL,sig_handler)处理信号,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出。
#define _MULTI_THREADED #include <pthread.h> #include <stdio.h> #include "check.h" void cleanupHandler(void *parm) { printf("Inside cancellation cleanup handler/n"); } void *threadfunc(void *parm) { unsigned int i=0; int rc=0, oldState=0; printf("Entered secondary thread/n"); pthread_cleanup_push(cleanupHandler, NULL); rc = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState); checkResults("pthread_setcancelstate()/n", rc); /* Allow cancel to be pending on this thread */ sleep(2); while (1) { printf("Secondary thread is now looping/n"); ++i; sleep(1); /* pthread_testcancel() has no effect until cancelability is enabled.*/ /* At that time, a call to pthread_testcancel() should result in the */ /* pending cancel being acted upon */ pthread_testcancel(); if (i == 5) { printf("Cancel state set to ENABLE/n"); rc = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldState); checkResults("pthread_setcancelstate(2)/n", rc); /* Now, cancellation points will allow pending cancels to get through to this thread */ } } /* infinite */ pthread_cleanup_pop(0); return NULL; } int main(int argc, char **argv) { pthread_t thread; int rc=0; void *status=NULL; printf("Enter Testcase - %s/n", argv[0]); /* Create a thread using default attributes */ printf("Create thread using the NULL attributes/n"); rc = pthread_create(&thread, NULL, threadfunc, NULL); checkResults("pthread_create(NULL)/n", rc); sleep(1); printf("Cancel the thread/n"); rc = pthread_cancel(thread); checkResults("pthread_cancel()/n", rc); rc = pthread_join(thread, &status); if (status != PTHREAD_CANCELED) { printf("Thread returned unexpected result!/n"); exit(1); } printf("Main completed/n"); return 0; }
Output:
Enter Testcase - QP0WTEST/TPTESTC0
Create thread using the NULL attributes
Entered secondary thread
Cancel the thread
Secondary thread is now looping
Secondary thread is now looping
Secondary thread is now looping
Secondary thread is now looping
Secondary thread is now looping
Cancel state set to ENABLE
Secondary thread is now looping
Inside cancellation cleanup handler
Main completed
(stevenliyong)
进程之间发送信号:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <signal.h> void send_signal(int pid,int signal) { if(kill(pid,signal) == 0) printf("send signal success.\n"); else printf("send signal failed.\n"); } void received_signal(int signal) { if(signal == SIGUSR1) printf("received signal SIGUSR1\n"); } int main() { pid_t pid; int status = 0; if((pid = fork()) == 0) { signal(SIGUSR1,received_signal); printf("i am child process pid = %d.\n",getpid()); while (1); } else { sleep(1); printf("pid = %d\n",(pid_t)pid); send_signal(pid,SIGUSR1); printf("i am parent process.pid = %d\n",getpid()); while (1); wait(&status); } exit(0); }
相关文章推荐
- pthread_kill和pthread_cancel
- 线程正常终止pthread_exit,pthread_join,pthread_kill,pthread_cancel,sigwait,sigaddset
- 线程正常终止pthread_exit,pthread_join,pthread_kill,pthread_cancel,sigwait,sigaddset
- pthread_kill 区别 phtread_cancel
- pthread_kill和pthread_cancel
- pthread_kill和pthread_cancel
- pthread_kill和pthread_cancel
- pthread_kill 与pthread_cancel使用方法
- pthread_cancel 和pthread_kill的区别
- pthread_kill和pthread_cancel
- pthread_kill()和pthread_cancel()的用法
- pthread_cancel的带来的一个死锁问题(验证)
- pthread_cancel
- linux多线程之pthread_cancel结束线程
- 6、一个 pthread_cancel 引起的线程死锁(转)
- linux中使用pthread_kill函数测试线程是否存活 .
- LINUX中使用PTHREAD_KILL函数测试线程是否存活的例子
- Linux Pthread_kill
- android bionic缺失pthread_cancel的解决方法
- pthread_cancel-linux 终止其他线程