- 论坛徽章:
- 0
|
我弄清楚了
sigset_t的结构为:
typedef struct __sigset {
__uint32_t __bits[_SIG_WORDS];
} __sigset_t;
所以要用printf可以先转存到int里面去.
unsigned long int a,b;
a=*(oldmask.__bits);
b=*(newmask.__bits);
这样子输出就正常了.
一般32位系统的_SIG_WORDS被define为4也就是sigset_t为128位的,
但是printf里面的%u为32位的,也就是说存参的时候push进去了两个128位,而实际
printf只读了前64位(两个32位的unsigned int).所以printf的第二个输出为0,实
际上是因为sigset_t为128位.以下程序可以证明这一点:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(int argc, char *argv[])
{
sigset_t newmask, oldmask;
sigemptyset(&newmask);
sigemptyset(&oldmask);
sigaddset(&newmask, SIGQUIT);
sigaddset(&oldmask, SIGILL);
printf("%u,%u\n", oldmask, newmask);
printf("%u,%u\n", newmask, oldmask);
sigaddset(&oldmask, 33);
printf("%u,%u\n", oldmask, newmask);
printf("%u,%u\n", newmask, oldmask);
return 0;
}
输出为:
8,0
4,0
8,1
4,0
sigaddset(&oldmask, 33)后第33位置1,导致printf的第二个%u为1.所以输出为8,1 |
|