1、登录 root 用户:
su - root # 输入密码即可
2、准备环境
确保你的 CentOS 系统已安装 GCC 编译器:
sudo yum install gcc -y
如果无法连接到官方镜像站点 (mirrorlist.centos.org),通常是由于 网络连接问题 或 DNS 解析失败 导致的
修改镜像源
(1) 备份原有 repo 文件
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
(2) 下载阿里云镜像源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
(3) 清理缓存并更新
sudo yum clean all sudo yum makecache sudo yum update
3、创建并编辑源代码文件
使用 vi 或 nano 创建 C 程序文件:
vi signal_comm.c
按 i 进入编辑模式,粘贴下面的完整代码,然后按 ESC 输入 :wq 保存退出。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/types.h> pid_t child_pid; // 子进程的信号处理函数 void child_signal_handler(int sig) { if (sig == SIGUSR1) { printf("Bye.World!\n"); exit(0); } } // 子进程函数 void child_process() { // 设置信号处理函数 signal(SIGUSR1, child_signal_handler); while (1) { printf("I am Child Process, alive!\n"); sleep(2); } } int main() { // 创建子进程 child_pid = fork(); if (child_pid < 0) { perror("fork failed"); exit(1); } if (child_pid == 0) { // 子进程代码 child_process(); } else { // 父进程代码 char answer; while (1) { printf("To terminate Child Process. Yes or No?\n"); scanf(" %c", &answer); // 注意空格,跳过空白字符 if (answer == 'Y' || answer == 'y') { // 发送SIGUSR1信号给子进程 kill(child_pid, SIGUSR1); break; } else if (answer == 'N' || answer == 'n') { sleep(2); // 延迟2秒 } else { printf("Please answer Y or N.\n"); } } // 等待子进程结束 wait(NULL); printf("Child process has been terminated.\n"); } return 0; }
程序说明 信号处理: 子进程使用signal(SIGUSR1, child_signal_handler)注册了SIGUSR1信号的处理函数 当收到SIGUSR1信号时,会打印"Bye.World!"并退出 子进程行为: 进入无限循环,每2秒打印一次"I am Child Process, alive!" 收到SIGUSR1信号后执行信号处理函数并退出 父进程行为: 询问用户是否终止子进程 如果回答'N',等待2秒后再次询问 如果回答'Y',向子进程发送SIGUSR1信号 使用wait(NULL)等待子进程结束 关键函数: fork() - 创建子进程 signal() - 注册信号处理函数 kill() - 向指定进程发送信号 wait() - 等待子进程结束 编译和运行 将代码保存为signal_comm.c 编译:gcc signal_comm.c -o signal_comm 运行:./signal_comm 注意事项 SIGUSR1是用户自定义信号,编号为10 使用kill()发送信号需要知道目标进程的PID 信号处理函数应尽量简单,避免使用不可重入函数 父进程使用wait()避免产生僵尸进程
4、编译程序
gcc signal_comm.c -o signal_comm
成功后会生成可执行文件 signal_comm。
5、运行程序
./signal_comm
6、操作示例
程序运行后你会看到
I am Child Process, alive! To terminate Child Process. Yes or No?
输入 N 然后回车:子进程会继续每2秒输出状态 输入 Y 然后回车:会看到子进程输出 Bye.World! 然后退出
7、验证进程通信
可以打开另一个终端窗口,用 ps 命令观察进程状态:
ps aux | grep signal_comm
发送信号测试(不推荐手动操作,程序已自动处理):
kill -SIGUSR1 [子进程PID]
8、可能遇到的问题及解决
问题 1:编译错误‘’signal.h not found’‘
sudo yum install glibc-headers
问题 2:权限不足
chmod +x signal_comm
问题 3:程序无法终止
强制结束:
pkill signal_comm
关键点说明
信号机制:
SIGUSR1 是用户自定义信号(编号 10)
使用 kill() 发送信号需要知道目标 PID
进程管理:
父进程通过 wait() 回收子进程资源
用 ps 命令可以查看运行状态
CentOS 特性:
默认已安装基础开发工具
信号行为符合 POSIX 标准
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于