linux线程中scanf函数,linux线程通信:sigwait和pthread_kill

1、函数介绍

1.1 sigwait

sigwait的含义就如同它的字面意思:等待某个信号的到来。

如果调用该函数的线程没有等到它想等待的信号那么该线程就休眠。

要达到等到一个信号,我们得做下面的事!

首先,定义一个信号集

#include sigset_t set;

其次,向信号集中加入我们想等待的信号

#include

int sigemptyset(sigset_t *set);//清空信号集

int sigaddset(sigset_t *set,int signo);//将某个信号加入到信号集中

int sigdelset(sigset_t *set,int signo);//删除信号集中的某个信号

int sigfillset(sigset_t *set);//包含所有已定义的信号

最后,将该信号集中的信号加入到线程信号屏蔽字(线程信号等待队列)中

#include

int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);

how:

SIG_BLOCK:把参数set中的信号添加到线程的信号屏蔽字中

SIG_SETMASK:把线程的信号屏蔽字设置为参数set中的信号

SIG_UNBLOCK:从线程信号屏蔽字中删除参数set中的信号

set:用户设置的信号屏蔽字

oldset:返回原先的信号屏蔽字

经过这样的设置我们就可以在线程该等待的地方调用sigwait休眠该线程了。

1.2 pthread_kill

#include

int pthread_kill(pthread_t thread, int sig);

thread:给哪个线程发送信号

sig:发送的信号值

1.3 sigaction

sigaction函数可以读取和修改与指定信号相关联的处理动作,它的声明如下:

#include

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

其中关键就是第二个参数act,他是一个sigaction类型,结构如下:

struct sigaction {

void (*sa_handler)(int);

void (*sa_sigaction)(int, siginfo_t *, void *);

sigset_t sa_mask;

int sa_flags;

void (*sa_restorer)(void);

};

其中关键的是sa_handler这个参数,它通常可以有如下几种赋值:

·常数SIG_IGN表示忽略信号

·常数SIG_DFL表示执行系统默认动作,一般用于恢复信号处理

·赋值为一个函数指针表示用自定义函数捕捉信号另外,如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,

还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。

2 程序示例

#include

#include

#include

void *threadfunc1(void *pvoid)

{

int signum;

sigset_t sig;

int signum;

sigemptyset(&sig);

sigaddset(&sig,SIGUSR1);

pthread_sigmask(SIG_BLOCK,&sig,NULL);//设置该线程的信号屏蔽字为SIGUSR1

while(1)

{

sigwait(&sig,&signum);//睡眠等待SIGUSR1信号的到来

printf("threadfunc1 waiting is over!\n");

}

}

void *threadfunc2(void *pvoid)

{

int signum;

sigset_t sig;

int signum;

sigemptyset(&sig);

sigaddset(&sig,SIGUSR1);

pthread_sigmask(SIG_BLOCK,&sig,NULL);//设置该线程的信号屏蔽字为SIGUSR1

while(1)

{

sigwait(&sig,&signum);//睡眠等待SIGUSR1信号的到来

printf("threadfunc2 waiting is over!\n");

}

}

void main()

{

pthread_t thread1,thread2;

pthread_create(&thread1,NULL,threadfunc1,(void *)NULL);

pthread_create(&thread2,NULL,threadfunc2,(void *)NULL);

pthread_detach(thread1);

pthread_detach(thread2);

struct sigaction act;

act.sa_handler=SIG_IGN;

sigemptyset(&act.sa_mask);

act.sa_flags=0;

sigaction(SIGUSR1,&act,0);//设置信号SIGUSR1的处理方式忽略

while(1)

{

printf("please input select a number in (1,2)!\n");

scanf("%d",&i);

if(i==1)

pthread_kill(thread1,SIGUSR1);

if(i==2)

pthread_kill(thread2,SIGUSR1);

}

}//编译 gcc -o pthread pthread.c -lpthread

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值