实现思路
- 使用
fork()
函数创建子进程。
- 在父进程中使用
alarm()
函数设置5秒的定时器。
- 使用
waitpid()
函数等待子进程结束,waitpid()
的WNOHANG
标志用于非阻塞等待。
- 处理
SIGALRM
信号,在信号处理函数中设置一个标志表示超时。
- 根据等待结果和超时标志打印相应信息。
核心代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
volatile sig_atomic_t timeout = 0;
void alarm_handler(int signum) {
timeout = 1;
}
int main() {
pid_t pid;
int status;
// 注册信号处理函数
signal(SIGALRM, alarm_handler);
// 创建子进程
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子进程
sleep(2); // 模拟子进程执行任务
exit(EXIT_SUCCESS);
} else {
// 父进程
alarm(5); // 设置5秒超时
while (!timeout) {
pid_t result = waitpid(pid, &status, WNOHANG);
if (result == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
} else if (result == pid) {
// 子进程正常结束
alarm(0); // 取消定时器
if (WIFEXITED(status)) {
printf("子进程退出状态: %d\n", WEXITSTATUS(status));
}
break;
}
sleep(1);
}
if (timeout) {
printf("等待子进程超时\n");
}
}
return 0;
}