- 论坛徽章:
- 0
|
继续测试sigsuspend,现在代码改成下面这个样子,sigsuspend还是被死锁了...
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <errno.h>
- /* print signal mask bits */
- void pr_mask(const char * _str)
- {
- sigset_t sigset;
- int errno_save;
- errno_save = errno;
- if(sigprocmask(0, NULL, &sigset) < 0)
- printf("sigprocmask error\n");
-
- printf("%s", _str);
- if(sigismember(&sigset, SIGINT))
- printf("SIGINT ");
- if(sigismember(&sigset, SIGQUIT))
- printf("SIGQUIT ");
- if(sigismember(&sigset, SIGUSR1))
- printf("SIGUSR1 ");
- if(sigismember(&sigset, SIGALRM))
- printf("SIGALRM ");
- if(sigismember(&sigset, SIGCHLD))
- printf("SIGCHLD ");
- printf("\n");
- errno = errno_save;
- }
- /* signal handler */
- void sig_handler(int _signo)
- {
- if(_signo == SIGCHLD)
- {
- printf("sig_handler <<< SIGCHLD\n");
- }
- else if(_signo == SIGALRM)
- {
- printf("sig_handler <<< SIGALRM\n");
- }
- else if(_signo == SIGUSR1)
- {
- printf("sig_handle <<< SIGUSR1\n");
- }
- else if(_signo == SIGQUIT)
- {
- printf("sig_handle <<< SIGQUIT\n");
- }
- else if(_signo == SIGINT)
- {
- printf("sig_handle <<< SIGINT\n");
- }
- else
- {
- printf("sig_handler <<< unexpect signal\n");
- }
- pr_mask("in sig_handle ");
- }
- /* process */
- int main(int argc, char * argv[])
- {
- int pid;
- int status;
- int count;
- sigset_t newmask, oldmask, pendmask;
- // signal(SIGUSR1, sig_handler); -> signal(SIGALRM, sig_handler);
- signal(SIGALRM, sig_handler);
- pr_mask("before sigprocmask: ");
-
- sigemptyset(&newmask);
- sigemptyset(&oldmask);
- sigprocmask(0, NULL, &oldmask); /* 保存原来的信号集 */
- pr_mask("after sigprocmask: ");
- if(0 == (pid = fork())) /* child */
- {
- printf("child running, id = %d\n", getpid());
- sleep(2);
- alarm(1); /* alarm 一下 */
- sleep(2);
- printf("child exit\n");
- }
- else if(pid > 0) /* parent */
- {
- printf("parent running, id = %d\n", getpid());
- if(sigsuspend(&newmask) != -1) /* sig_handler也调用了,但是这里没有返回,父进程在这里死锁了... , why? */
- printf("sigsuspend error\n");
- pr_mask("after return from sigsuspend ");
- sleep(2);
- sigprocmask(SIG_SETMASK, &oldmask, 0);
- }
- else /* error */
- {
- printf("fork error\n");
- }
- return 0;
- }
复制代码 |
|