线程和信号

来源:互联网 发布:筒仓设计软件 编辑:程序博客网 时间:2024/06/05 00:19

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <signal.h>

#include <errno.h>

#include <pthread.h>

#include <unistd.h>

#include <sys/types.h>


void sig_handler(int signum)

{

if(signum == SIGUSR1)

printf("sigusr1/n");

else if(signum == SIGUSR2)

printf("sigusr2/n");

else

printf("Receive signale: %d/n", signum);

}


void *sigmgr_thread(void *arg)

{

sigset_t waitset;

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);


while(1) {

rc = sigwait(&waitset, &sig);

if(rc == 0) {

sig_handler(sig);

} else {

printf("sigwaitinfo() return err: %d; %s/n", errno, strerror(errno));

}

}

}


int main(void)

{

sigset_tbset, oset;

pid_tpid = getpid();

pthread_tppid;


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);


pthread_create(&ppid, NULL, sigmgr_thread, NULL);


sleep(10);


exit(0);

}

 

无可奈何花落去别大地回春

 

原创粉丝点击