手机网站制作代理商,文化馆网站建设方案,濮阳 网站建设,视频剪辑线下培训班1. 进程内所有线程共享信号处理配置#xff0c;故信号配置可以全部放在主线程内。
2. 每个线程有自己的信号掩码sigset_t#xff0c;线程创建时继承创建时线程的信号掩码。
3. 触发信号处理函数按创建线程顺序分配给当前空闲线程#xff0c;信号处理函数内是可以阻塞的。 …1. 进程内所有线程共享信号处理配置故信号配置可以全部放在主线程内。
2. 每个线程有自己的信号掩码sigset_t线程创建时继承创建时线程的信号掩码。
3. 触发信号处理函数按创建线程顺序分配给当前空闲线程信号处理函数内是可以阻塞的。
4. 设置sa_flags添加SA_NODEFER可以将当前信号处理函数设置为非阻塞模式。
5. 非阻塞模式下即便上一个信号处理没有结束不会影响下一次信号处理函数进入。
6. 同时触发的信号数字越小优先级越高。
7.信号处理函数内不应进行加锁操作极容易造成死锁。
8. kill()触发的信号由进程主线程执行pthread_kill()触发的信号由参数指定的线程执行。
9.sigwait()可以将异步信号模式改为同步模式可将信号处理放入单独线程去做。
下面是测试例子
#include pthread.h
#include stdio.h
#include stdlib.h
#include unistd.h
#include signal.h
#include errno.h
#include time.h
#include sys/time.hstatic void* thread_func(void * args)
{pthread_t tid pthread_self();printf([child] thread id:%lu\r\n, tid);printf([child] thread sleep\r\n);sleep(30);printf([child] thread exit\r\n);return 0;
}static void signal_main_func(int signo, siginfo_t *info, void *data)
{pthread_t tid pthread_self();printf([signal-mian] signal:[%d]. current thread id:%lu, \r\n, signo, tid);printf([signal-mian] signal sleep\r\n);sleep(20);printf([signal-mian]signal exit\r\n);
}static void signal_child_func(int signo, siginfo_t *info, void *data)
{pthread_t tid pthread_self();printf([signal-child] signal:[%d]. current thread id:%lu\r\n, signo, tid);printf([signal-child] child signal sleep\r\n);sleep(2);printf([signal-child] child signal exit\r\n);}static void signal_timeout(int n)
{pthread_t tid pthread_self();printf([signal-timer] timeout[%d]. current thread id:%lu\r\n, n,tid);
}void init_timer(int ms)
{struct sigaction act;struct itimerval value;act.sa_handler signal_timeout;act.sa_flags SA_RESTART;sigemptyset(act.sa_mask);sigaction(SIGALRM, act, NULL );value.it_value.tv_sec ms/1000;value.it_value.tv_usec ms%1000 * 1000;value.it_interval value.it_value;setitimer(ITIMER_REAL, value, NULL );
}void init_signal(int signo, void* handler)
{struct sigaction act;act.sa_sigaction (void (*)(int, siginfo_t *, void *))handler;act.sa_flags SA_SIGINFO;sigemptyset(act.sa_mask);sigaction(signo, act, NULL );
}int main(int argc, char** argv)
{int ret;int count 10;pthread_t tid;tid pthread_self();printf([main] thread id:%lu\r\n, tid);init_signal(SIGINT, signal_main_func);init_timer(1000);init_signal(SIGUSR1, signal_child_func);ret pthread_create(tid, 0, (void*)thread_func, NULL);if (ret 0) {printf(failed to create thread.\r\n);return -1;}pthread_detach(tid);while(count-- 0) {printf([main] kill child. child thread id:%lu\r\n, tid);pthread_kill(tid, SIGUSR1);printf([main] thread sleep. count:%d\r\n, count);sleep(3);}printf([main] thread exit\r\n);return 0;
}
执行结果