#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<signal.h>
void sig(int signo)
{
if(signo==SIGUSR1)
printf("hiiiin");
}
void * runner(void * param)
{
signal(SIGUSR1,sig);
while(1)
sleep(1);
}
int main()
{
pthread_t rid,sid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&sid,&attr,runner,NULL);
pthread_create(&rid,&attr,runner,NULL);
//sleep(1);
pthread_kill(sid,SIGUSR1);
printf("heyn");
pthread_kill(rid,SIGUSR1);
pthread_join(rid,NULL);
}
输出:
harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
User defined signal 1
harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
User defined signal 1
harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
User defined signal 1
harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
User defined signal 1
harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
User defined signal 1
harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
User defined signal 1
harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
User defined signal 1
harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
hey
hiiii
hiiii
^C
harikrishna@harikrishna:~/Desktop/Ass3b_43$
您遇到的问题是您从线程中注册信号处理程序。由于线程没有同步,因此可以在注册处理程序之前将信号发送到线程。
当您看到" User defined signal 1
"时,这意味着您在注册信号处理程序之前将信号发送到线程。
由于信号处理程序在线程之间共享,因此您不必从线程进行注册:您可以在创建它们之前进行:
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<signal.h>
void sig(int signo)
{
if(signo==SIGUSR1)
printf("hiiiin");
}
void * runner(void * param)
{
while(1)
sleep(1);
}
int main()
{
pthread_t rid,sid;
pthread_attr_t attr;
/* register signal handler */
signal(SIGUSR1,sig);
/* create thread */
pthread_attr_init(&attr);
pthread_create(&sid,&attr,runner,NULL);
pthread_create(&rid,&attr,runner,NULL);
/* send signals */
pthread_kill(sid,SIGUSR1);
printf("heyn");
pthread_kill(rid,SIGUSR1);
/*terminate thread*/
pthread_cancel(sid);
pthread_cancel(rid);
/* join */
pthread_join(sid,NULL);
pthread_join(rid,NULL);
}
使用此代码,您仍然可能将hiii
和hey
混合,但您不应该再有User defined signal 1