- 论坛徽章:
- 0
|
sigwaitinfo在调用setgid后会跳出来,返回Interrupted system call,很诡异,但是sigwait就不会。
请看代码:
test2.c
- #include <signal.h>
- #include <errno.h>
- #include <pthread.h>
- #include <unistd.h>
- #include <sys/types.h>
- void sig_handler(int signum)
- {
- printf("Receive signal. %d\n", signum);
- }
- void* sigmgr_thread()
- {
- sigset_t waitset, oset;
- int sig;
- int rc;
- pthread_t ppid = pthread_self();
- pthread_detach(ppid);
- sigemptyset(&waitset);
- sigaddset(&waitset, SIGRTMIN);
- sigaddset(&waitset, SIGRTMIN+2);
- sigaddset(&waitset, SIGRTMAX);
- sigaddset(&waitset, SIGUSR1);
- sigaddset(&waitset, SIGUSR2);
- siginfo_t myinfo;
- while (1) {
- rc = sigwaitinfo(&waitset, &myinfo);
- if (rc != -1) {
- sig_handler(myinfo.si_signo);
- } else {
- printf("sigwaitinfo() returned err: %d; %s\n", errno, strerror(errno));
- }
- }
- }
- int main()
- {
- sigset_t bset, oset;
- int i;
- pid_t pid = getpid();
- pthread_t ppid;
- sigemptyset(&bset);
- sigaddset(&bset, SIGRTMIN);
- sigaddset(&bset, SIGRTMIN+2);
- sigaddset(&bset, SIGRTMAX);
- sigaddset(&bset, SIGUSR1);
- sigaddset(&bset, SIGUSR2);
- if (pthread_sigmask(SIG_BLOCK, &bset, &oset) != 0)
- printf("!! Set pthread mask failed\n");
- kill(pid, SIGRTMAX);
- kill(pid, SIGRTMAX);
- kill(pid, SIGRTMIN+2);
- kill(pid, SIGRTMIN);
- kill(pid, SIGRTMIN+2);
- kill(pid, SIGRTMIN);
- kill(pid, SIGUSR2);
- kill(pid, SIGUSR2);
- kill(pid, SIGUSR1);
- kill(pid, SIGUSR1);
- // Create the dedicated thread sigmgr_thread() which will handle signals synchronously
- pthread_create(&ppid, NULL, sigmgr_thread, NULL);
- // pthread_detach(ppid);
- sleep(1);
- setgid(1001);
- sleep(1);
- exit (0);
- }
复制代码
执行的结果是:
Receive signal. 10
Receive signal. 12
Receive signal. 34
Receive signal. 34
Receive signal. 36
Receive signal. 36
Receive signal. 64
Receive signal. 64
sigwaitinfo() returned err: 4; Interrupted system call
test.c
- #include <signal.h>
- #include <errno.h>
- #include <pthread.h>
- #include <unistd.h>
- #include <sys/types.h>
- void sig_handler(int signum)
- {
- printf("Receive signal. %d\n", signum);
- }
- void* sigmgr_thread()
- {
- sigset_t waitset, oset;
- int sig;
- int rc;
- pthread_t ppid = pthread_self();
- pthread_detach(ppid);
- sigemptyset(&waitset);
- sigaddset(&waitset, SIGRTMIN);
- sigaddset(&waitset, SIGRTMIN+2);
- sigaddset(&waitset, SIGRTMAX);
- sigaddset(&waitset, SIGUSR1);
- sigaddset(&waitset, SIGUSR2);
- siginfo_t myinfo;
- while (1) {
- rc = sigwait(&waitset, &sig);
- if (rc != -1) {
- sig_handler(sig);
- } else {
- printf("sigwaitinfo() returned err: %d; %s\n", errno, strerror(errno));
- }
- }
- }
- int main()
- {
- sigset_t bset, oset;
- int i;
- pid_t pid = getpid();
- pthread_t ppid;
- sigemptyset(&bset);
- sigaddset(&bset, SIGRTMIN);
- sigaddset(&bset, SIGRTMIN+2);
- sigaddset(&bset, SIGRTMAX);
- sigaddset(&bset, SIGUSR1);
- sigaddset(&bset, SIGUSR2);
- if (pthread_sigmask(SIG_BLOCK, &bset, &oset) != 0)
- printf("!! Set pthread mask failed\n");
- kill(pid, SIGRTMAX);
- kill(pid, SIGRTMAX);
- kill(pid, SIGRTMIN+2);
- kill(pid, SIGRTMIN);
- kill(pid, SIGRTMIN+2);
- kill(pid, SIGRTMIN);
- kill(pid, SIGUSR2);
- kill(pid, SIGUSR2);
- kill(pid, SIGUSR1);
- kill(pid, SIGUSR1);
- // Create the dedicated thread sigmgr_thread() which will handle signals synchronously
- pthread_create(&ppid, NULL, sigmgr_thread, NULL);
- sleep(1);
- setgid(1001);
- sleep(1);
- exit (0);
- }
复制代码
执行结果是:
Receive signal. 10
Receive signal. 12
Receive signal. 34
Receive signal. 34
Receive signal. 36
Receive signal. 36
Receive signal. 64
Receive signal. 64
另外test2.c在freebsd下执行的结果是:
Receive signal. 30
Receive signal. 31
Receive signal. 65
Receive signal. 67
Receive signal. 126
难道在freebsd下实时信号不排队吗?
系统版本信息:
Linux skeeter-desktop 2.6.28-16-generic #56-Ubuntu SMP Mon Nov 2 10:43:06 UTC 2009 i686 GNU/Linux
FreeBSD 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Sun Feb 24 19:59:52 UTC 2008 root@logan.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
在linux下strace的结果是:
rt_sigprocmask(SIG_BLOCK, [CHLD], [USR1 USR2 RT_2 RT_4], = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, = 0
rt_sigprocmask(SIG_SETMASK, [USR1 USR2 RT_2 RT_4], NULL, = 0
nanosleep({1, 0}, {1, 0}) = 0
tgkill(14156, 14157, SIGRT_1) = 0
sigwaitinfo() returned err: 4; Interrupted system call
setgid32(1001) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [USR1 USR2 RT_2 RT_4], = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, = 0
rt_sigprocmask(SIG_SETMASK, [USR1 USR2 RT_2 RT_4], NULL, = 0
nanosleep({1, 0}, {1, 0}) = 0
exit_group(0) = ?
应该是这里的tgkill引起的,但我不知道SIGRT_1是啥,从字面上猜测SIGRT_1可能是第一个实时信号?但是为啥调用setgid会产生实时信号呢?
[ 本帖最后由 wwdwwd 于 2009-11-25 22:40 编辑 ] |
|