sigwait和pthread_kill的使用.只发了一个信号阿?怎么有等到两个????

时间:2021-12-14 14:42:31

/*********************************************************************************/
/*
sigwait和pthread_kill的使用
*/
/********************************************************************************/

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

void * fun(void * arg)
{
int *p = (int *)arg;
printf("in pthread:%x %x\n", getpid(), pthread_self());

pthread_kill(*p, SIGINT);
return (void *)0;
}

int main()
{
pthread_t tid;
int err;
sigset_t st;
int ptid;
int num;

sigfillset(&st);
ptid = pthread_self();

if ((err = pthread_create(&tid, NULL, fun, (void *)(&ptid))) != 0)
{
printf("pthread error!\n");
}

if (sigwait(&st, &num) != 0)
{
printf("sigwait error!\n");
}

//只发了一个信号阿?怎么有等到两个????
printf("the num of signo  is %d \n", num);

//sleep(3);

printf("in main:%x %x\n", getpid(), pthread_self());
printf("%d \n", pthread_equal(tid, pthread_self()));


return 0;
}

运行结果:
[root@localhost niwen]# gcc 1.c -lpthread
[root@localhost niwen]# ./a.out
in pthread:35aa b7f50b90
the num of signo  is 2 
in main:35aa b7f516c0

[root@localhost niwen]# 


只发了一个信号阿?怎么有等到两个????

11 个解决方案

#1


友情帮顶

#2


建议lz仔细阅读sigwait的文档

#3


引用 2 楼 lilome 的回复:
建议lz仔细阅读sigwait的文档
看着也看不懂啊

#4


in pthread:227b b75e0b70

我的机子上只输出这个.
SIGINT 换成SIGUSER1

in pthread:22d8 b7699b70
用户定义信号 1

#5


呵呵,

#6


那为什么SIGINT会有两个呢??

#7


[root@localhost niwen]# ./1
in pthread:552d b7f1fb90
the num of signo  is 10 
in main:552d b7f206c0

[root@localhost niwen]# 

改成SIGUSR1

#8


从上面就可以看出,不同的系统输出不一样. 这样的问题就没有必要深究了.
我的是opensuse  你的是啥.

#9


vmware-workstation-6.5.1-126130
哦,我知道啦。。。谢谢啦

#10


sigwait(&st, &num)
第二个参数是收到的信号所对应的数字。尤晋元翻译的《Unix环境高级编程》里面说第二个参数是“表明发送信号的数量”。感觉有误。

这里SIGINT信号对应的数字是2,所以输出为2。并不是说发了两个信号。

#11


int sigwait(const sigset_t *set, int *sig);
sigwait  suspends  the  calling thread until one of the signals in set is delivered to the calling thread. It then stores the number of the signal received in the location pointed to by sig and returns. The signals in set must be blocked and not ignored on entrance to sigwait. If the delivered signal has a signal handler function attached, that function is not called.

#1


友情帮顶

#2


建议lz仔细阅读sigwait的文档

#3


引用 2 楼 lilome 的回复:
建议lz仔细阅读sigwait的文档
看着也看不懂啊

#4


in pthread:227b b75e0b70

我的机子上只输出这个.
SIGINT 换成SIGUSER1

in pthread:22d8 b7699b70
用户定义信号 1

#5


呵呵,

#6


那为什么SIGINT会有两个呢??

#7


[root@localhost niwen]# ./1
in pthread:552d b7f1fb90
the num of signo  is 10 
in main:552d b7f206c0

[root@localhost niwen]# 

改成SIGUSR1

#8


从上面就可以看出,不同的系统输出不一样. 这样的问题就没有必要深究了.
我的是opensuse  你的是啥.

#9


vmware-workstation-6.5.1-126130
哦,我知道啦。。。谢谢啦

#10


sigwait(&st, &num)
第二个参数是收到的信号所对应的数字。尤晋元翻译的《Unix环境高级编程》里面说第二个参数是“表明发送信号的数量”。感觉有误。

这里SIGINT信号对应的数字是2,所以输出为2。并不是说发了两个信号。

#11


int sigwait(const sigset_t *set, int *sig);
sigwait  suspends  the  calling thread until one of the signals in set is delivered to the calling thread. It then stores the number of the signal received in the location pointed to by sig and returns. The signals in set must be blocked and not ignored on entrance to sigwait. If the delivered signal has a signal handler function attached, that function is not called.