- 论坛徽章:
- 0
|
又想到尝试使用
sigsetjmp/siglongjmp函数来实现跳转的方式执行代码- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <setjmp.h>
- #include <signal.h>
- #include <pthread.h>
- /**
- * 线程函数
- */
- int * sinal_send_pthread(void *arg)
- {
- //每隔一段时间发送一个信号
- union sigval value;
- while(1)
- {
- sleep(1);
- value.sival_ptr = arg;//这里发送信号的时候带上数据jmp_buf env
- printf("send signal\n");
- if(sigqueue(getpid(),SIGRTMIN+15,value) < 0)
- {
- perror("sigqueue");
- exit(1);
- }
- }
- }
- /**
- * 信号函数
- */
- void signal_handler(int signal,siginfo_t *siginfo,void *pvoid)
- {
- printf("recv signal\n");
- siglongjmp(*((jmp_buf *)(siginfo->si_ptr)),1);//跳转到sigsetjmp这个地方
- }
- int main()
- {
- //创建一个跳转变量
- jmp_buf env;
- struct sigaction act;
- //创建一个线程
- pthread_t sig_send;
- if(0 != pthread_create(&sig_send,NULL,(void *)sinal_send_pthread,
- &env))
- {
- perror("pthread create");
- exit(1);
- }
- switch(sigsetjmp(env,1))
- {
- case 0:
- break;
- case 1:
- printf("pause end xxx\n");
- break;
- default:
- break;
- }
- //调整信号使用3参数信号处理函数
- act.sa_sigaction = signal_handler;
- act.sa_flags = SA_SIGINFO;
- sigaction(SIGRTMIN+15,&act,NULL);
- while(1)
- {
- pause();//这里等待阻塞信号
- printf("pause end\n");
- }
- return 0;
- }
复制代码 结果是这样的
send signal
recv signal
pause end xxx
然后就没有一直这样了。并没有运行pause函数后面的打印语句。
恳求指教,不知道这个该如何实现了!!! |
|