linux 进程间通信-信号编程

1、函数实例。
下面这个示例首先使用 fork()创建了一个子进程,接着为了保证子进程不在父进程调用 kill()之前退出,在
子进程中使用 raise()函数向自身发送 SIGSTOP 信号,使子进程暂停。接下来再在父进程中调用 kill()向子
进程发送信号,在该示例中使用的是 SIGKILL,读者可以使用其他信号进行练习。

/* kill_raise.c */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
int main() 
{ 
	 pid_t pid; 
	 int ret; 
	 
	 /* 创建一子进程 */ 
	 if ((pid = fork()) < 0) 
	 { 
		 printf("Fork error\n"); 
		 exit(1); 
	 } 
	 
	 if (pid == 0) 
	 { 
		 /* 在子进程中使用 raise()函数发出 SIGSTOP 信号,使子进程暂停 */ 
		 printf("Child(pid : %d) is waiting for any signal\n", getpid()); 
		 raise(SIGSTOP); 
		 exit(0); 
	 } 
	 else 
	 { 
	 /* 在父进程中收集子进程发出的信号,并调用 kill()函数进行相应的操作 */
	 if ((waitpid(pid, NULL, WNOHANG)) == 0) 
	 { 
		 if ((ret = kill(pid, SIGKILL)) == 0) 
		 { 
		 	printf("Parent kill %d\n",pid); 
		 } 
	 } 
	 
	 waitpid(pid, NULL, 0); 
	 exit(0); 
	 } 
}

该程序运行结果如下所示:

$ ./kill_raise 
Child(pid : 4877) is waiting for any signal 
Parent kill 4877

2、函数实例。
该实例实际上已完成了一个简单的 sleep()函数的功能,由于 SIGALARM 默认的系统动作为终止该进程,
因此程序在打印信息之前,就会被结束了。代码如下所示:

/* alarm_pause.c */ 
#include <unistd.h> 
#include <stdio.h>
#include <stdlib.h> 
int main() 
{ 
	 /*调用 alarm 定时器函数*/ 
	 int ret = alarm(5); 
	 pause(); 
	 printf("I have been waken up.\n",ret); /* 此语句不会被执行 */ 
} 
$./alarm_pause 
Alarm clock

3、使用实例。
第一个实例表明了如何使用 signal()函数捕捉相应信号,并做出给定的处理。这里,my_func 就是信号处理
的函数指针。读者还可以将其改为 SIG_IGN 或 SIG_DFL 查看运行结果。第二个实例是用 sigaction()函数
实现同样的功能。
以下是使用 signal()函数的示例:

/* signal.c */
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 
/*自定义信号处理函数*/ 
void my_func(int sign_no) 
{ 
	 if (sign_no == SIGINT) 
	 { 
	 	printf("I have get SIGINT\n"); 
	 } 
	 else if (sign_no == SIGQUIT) 
	 { 
	 	printf("I have get SIGQUIT\n"); 
	 } 
} 
int main() 
{ 
	 printf("Waiting for signal SIGINT or SIGQUIT...\n"); 
	 
	 /* 发出相应的信号,并跳转到信号处理函数处 */ 
	 signal(SIGINT, my_func); 
	 signal(SIGQUIT, my_func); 
	 pause(); 
	 exit(0); 
} 

运行结果如下所示。

$ ./signal 
Waiting for signal SIGINT or SIGQUIT... 
I have get SIGINT (按 ctrl-c 组合键)
$ ./signal 
Waiting for signal SIGINT or SIGQUIT... 
I have get SIGQUIT (按 ctrl-\ 组合键)

以下是用 sigaction()函数实现同样的功能,下面只列出更新的 main()函数部分。
/* sigaction.c /
/
前部分省略 */

int main() 
{ 
	 struct sigaction action; 
	 printf("Waiting for signal SIGINT or SIGQUIT...\n"); 
	 
	 /* sigaction 结构初始化 */ 
	 action.sa_handler = my_func; 
	 sigemptyset(&action.sa_mask); 
	 action.sa_flags = 0;
	 /* 发出相应的信号,并跳转到信号处理函数处 */ 
	 sigaction(SIGINT, &action, 0); 
	 sigaction(SIGQUIT, &action, 0); 
	 pause(); 
	 exit(0); 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值