【C语言】利用sigsuspend实现等待某一个信号

一、函数sigsuspend

#include <signal.h>
int sigsuspend(const sigset_t *mask);
 
进程执行到sigsuspend时,sigsuspend并不会立刻返回,进程处于TASK_INTERRUPTIBLE状态并立刻放弃CPU,
等待UNBLOCK(mask之外的)信号的唤醒。


二、 示例说明


1  sigsuspend_wait.c实现等待信号

#include <stdio.h>
#include <string.h>
#include <signal.h>

int waitSig(int sig);
void sig_handler(int signo);
  
int main(int argc, char **argv)
{
	waitSig(SIGUSR1);
	return 0;
}

int waitSig(int sig)
{
	struct sigaction sa, savelast;
	sigset_t fill_mask;
	
	//这里不能设置为忽略,否则无法接受到sig的信号
	//sa.sa_handler = SIG_IGN;
	sa.sa_handler = sig_handler;
	sigemptyset(&sa.sa_mask);
	sa.sa_flags = 0;	
	
        printf("[%s] wait sig[%d]\n", __FUNCTION__, sig);
	// 指定信号的处理动作为sa(忽略信号), 并保存信号的上一次处理动作到savelast
        sigaction(sig, &sa, &savelast);  
  
        // 用来将参数信号集初始化,然后把所有的信号加入到此信号集里即将所有的信号标志位置为1,屏蔽所有的信号	
        sigfillset(&fill_mask);
  
        // 用来将参数sig代表的信号从参数set信号集里删除
        sigdelset(&fill_mask, sig);
  
        // 等待UNBLOCK(fill_mask之外的)信号的唤醒
        sigsuspend(&fill_mask);
  
        // 恢复信号
	sigaction(sig, &savelast, (struct sigaction *)0);
	printf("[%s] rece sig[%d]\n", __FUNCTION__, sig);
	
	return 0;
}

void sig_handler(int signo)  
{  
    printf("[%s] catch the signal [%d]\n", __FUNCTION__, signo);  
    return;
} 


2.  send_sig.c实现发送信号,默认发送信号为SIGUSR1
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <signal.h>

int main(int argc, char **argv)
{
	int pid = 0;
	int sig = SIGUSR1;
	
	if (argc < 2)
	{
			printf("usage: %s [pid_number]\n", argv[0]);
			printf("usage: %s [pid_number] [sig_num]\n", argv[0]);
			return -1;
	}
	
	pid = atoi(argv[1]);
	if (argv[2] != NULL)
	{
		sig = atoi(argv[2]);	
	}
		
	kill(pid, sig);
	printf("send sig[%d] to pid[%d]\n", sig, pid);
	
	return 0;
}

3.  运行结果

1. 启动等待信号进程 ./sigsuspend_wait &
 
2. ps查看进程号
5367 pts/0    00:00:00 sigsuspend_wait
 
3. 向进程sigsuspend_wait,发送信号  ./send_sig 5367
send sig[10] to pid[5367]
[sig_handler] catch the signal [10]
[waitSig] rece sig[10]


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值