1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <signal.h> #include <errno.h> #include <string.h>
int main() { pid_t current_pid = getpid(); pid_t parent_pid = getppid(); printf("=== Kill函数示例 ===\n"); printf("当前进程PID: %d\n", current_pid); printf("父进程PID: %d\n", parent_pid); // 示例1: 发送空信号检查进程是否存在 printf("\n示例1: 检查进程是否存在\n"); if (kill(current_pid, 0) == 0) { printf(" 进程 %d 存在\n", current_pid); } else { printf(" 进程 %d 不存在\n", current_pid); } // 示例2: 向自己发送SIGTERM信号 printf("\n示例2: 向自己发送SIGTERM信号\n"); printf(" 发送SIGTERM信号前...\n"); // 创建子进程来演示,避免终止主进程 pid_t child_pid = fork(); if (child_pid == 0) { // 子进程 printf(" 子进程 %d 准备接收信号\n", getpid()); sleep(1); printf(" 子进程退出\n"); exit(0); } else if (child_pid > 0) { // 父进程 sleep(1); // 等待子进程准备就绪 printf(" 向子进程 %d 发送SIGTERM信号\n", child_pid); if (kill(child_pid, SIGTERM) == 0) { printf(" 信号发送成功\n"); } else { perror(" kill失败"); } wait(NULL); // 等待子进程结束 } // 示例3: 演示不同信号的效果 printf("\n示例3: 不同信号的效果\n"); // 创建用于演示的子进程 child_pid = fork(); if (child_pid == 0) { // 子进程循环运行 printf(" 子进程 %d 开始运行...\n", getpid()); int i = 0; while (i < 10) { printf(" 子进程运行中... %d\n", i++); sleep(1); } printf(" 子进程正常退出\n"); exit(0); } else if (child_pid > 0) { // 父进程 sleep(2); // 让子进程运行一会儿 printf(" 向子进程 %d 发送SIGSTOP信号(暂停)\n", child_pid); kill(child_pid, SIGSTOP); sleep(2); printf(" 向子进程 %d 发送SIGCONT信号(继续)\n", child_pid); kill(child_pid, SIGCONT); sleep(2); printf(" 向子进程 %d 发送SIGTERM信号(终止)\n", child_pid); kill(child_pid, SIGTERM); wait(NULL); } // 示例4: 错误处理 printf("\n示例4: 错误处理\n"); if (kill(999999, SIGTERM) == -1) { printf(" 向不存在的进程发送信号: %s\n", strerror(errno)); } if (kill(parent_pid, 999) == -1) { printf(" 发送无效信号: %s\n", strerror(errno)); } printf("\n程序执行完毕\n"); return 0; }
|