题目:
创建两个进程交替打印AAAA和BBBB,使用定时器信号切换进行交替打印,注意:不是信号量处理
#include <stdio.h>
#include <sys/types.h> //该头文件用于pid,getppid等
#include <signal.h> //用于kill()等
#include <unistd.h> //该头文件用于alarm()
#include <stdlib.h> //该头文件用于pause()
pid_t pid;
//注册函数,用于循环输入A与B
void sigusr1_handler(int n){
if(pid > 0)
printf("AAAA\n");
else
printf("BBBB\n");
alarm(1); //睡眠--->信号
}
void sigalrm_handler(int n){
if(pid > 0)
kill(pid, SIGUSR1); //———>>向子进程发送信号,输出BBBB
else
kill(getppid(),SIGUSR1);
}
int main(){
// 注册处理函数绑定
signal(SIGALRM, sigalrm_handler);
signal(SIGUSR1, sigusr1_handler);
pid = fork();
if(pid > 0) //父进程处理
raise(SIGUSR1); //先调用父进程发送信号进行AAAA的输出
while(1)
pause(); //pause()会令目前的进程暂停(进入睡眠状态), 直到被信号(signal)所中断.
return 0;
}
备注:
1.函数名raise()
功能向正在执行的程序发送一个信号
用法int raise(int sig)
表头文件#include <signal.h
头文件:#include <sys/types.h> #include <signal.h>
2.定义函数:int kill(pid_t pid, int sig);
函数说明:kill()可以用来送参数sig 指定的信号给参数pid 指定的进程。参数pid 有几种情况:
1、pid>0 将信号传给进程识别码为pid 的进程.
2、pid=0 将信号传给和目前进程相同进程组的所有进程
3、pid=-1 将信号广播传送给系统内所有的进程
4、pid<0 将信号传给进程组识别码为pid 绝对值的所有进程参数 sig 代表的信号编号可参考附录D
返回值:执行成功则返回0, 如果有错误则返回-1.