2. 编写一段程序exp2_学号.c。创建一个子进程。子进程向父进程发送SIGALRM信号。父进程等待SIGALRM信号时一直被挂起,当捕捉到SIGALRM信号时输出“hello,学号!”。(利用pause,sigaction)
时间: 2024-05-01 09:18:01 浏览: 125
以下是实现该功能的代码:
```c
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void handler(int sig) {
printf("hello, 学号!\n");
}
int main() {
pid_t pid;
struct sigaction act;
// 安装信号处理程序
act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
if (sigaction(SIGALRM, &act, NULL) == -1) {
perror("sigaction");
return 1;
}
// 创建子进程
if ((pid = fork()) == -1) {
perror("fork");
return 1;
} else if (pid == 0) {
// 在子进程中发送 SIGALRM 信号
sleep(1);
kill(getppid(), SIGALRM);
_exit(0);
} else {
// 等待 SIGALRM 信号
pause();
}
return 0;
}
```
该程序中,首先定义了一个信号处理函数 `handler`,在收到 SIGALRM 信号时输出指定的信息。然后使用 `sigaction` 函数安装了信号处理程序。
接着,使用 `fork` 函数创建了一个子进程,该子进程等待1秒钟之后向父进程发送 SIGALRM 信号。而父进程则调用 `pause` 函数一直等待信号的到来,从而挂起了运行。
当子进程向父进程发送 SIGALRM 信号时,父进程捕捉到信号,便会执行设定的信号处理程序,从而输出指定的信息。最后,父进程结束运行,程序结束。