test4.c
来自「这个是学习嵌入式开发的重要例子」· C语言 代码 · 共 107 行
C
107 行
#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <unistd.h>#include <sys/types.h>#include <string.h>#include <errno.h>void parent_process_main(pid_t child);void child_process_main(void);void parent_signal_handler(int s);void child_signal_handler(int s);int global_parent_wakeup = 0;int global_child_sleep_flag = 0;int main(int argc, char **argv){ pid_t pid; if ((pid = fork()) < 0) { fprintf(stderr, "fork() failed: %s\n", strerror(errno)); exit(1); } else if (pid == 0) { // child process child_process_main(); exit(0); } parent_process_main(pid); return 0;}void child_process_main(void){ setsid(); signal(SIGINT, child_signal_handler); signal(SIGTERM, child_signal_handler); for (;;) { fprintf(stdout, "[%d]I'm working...\n", getpid()); //sleep(1); if (global_child_sleep_flag) { sleep(5); } }}void parent_process_main(pid_t child){ int i; signal(SIGINT, parent_signal_handler); for (;;) { if (global_parent_wakeup) { fprintf(stdout, "[%d]Parent process wake up.\n", getpid()); break; } } for (i = 0; i < 10; i++) { // int kill(pid_t pid, int sig); if (kill(child, SIGINT) < 0) { // Upon successful completion, 0 shall be returned. Otherwise, -1 shall be returned and errno set to indi-cate the error. fprintf(stderr, "kill() failed: %s\n", strerror(errno)); } else { fprintf(stdout, "[%d] Sending SIGINT to child process %d\n", getpid(), child); } //sleep(1); } kill(child, SIGTERM);}void parent_signal_handler(int s){ fprintf(stdout, "[%d]Catched %d signal.\n", getpid(), s); global_parent_wakeup++;}void child_signal_handler(int s){ fprintf(stdout, "[%d]Catched %d signal.\n", getpid(), s); if (s == SIGTERM) { global_child_sleep_flag++; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?