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 + -
显示快捷键?