先决条件: C.信号处理
null
在本文中,子进程和父进程之间的通信是使用kill()和signal()、fork()系统调用完成的。
- fork() 从父进程创建子进程。可以检查pid以确定它是子进程(如果pid==0)还是父进程(pid=子进程id)。
- 然后,父对象可以使用pid和kill()向子对象发送消息。
- 孩子用signal()拾取这些信号并调用适当的函数。
两个进程如何使用kill()和signal()相互对话的示例:
// C program to implement sighup(), sigint() // and sigquit() signal functions #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> // function declaration void sighup(); void sigint(); void sigquit(); // driver code void main() { int pid; /* get child process */ if ((pid = fork()) < 0) { perror ( "fork" ); exit (1); } if (pid == 0) { /* child */ signal (SIGHUP, sighup); signal (SIGINT, sigint); signal (SIGQUIT, sigquit); for (;;) ; /* loop for ever */ } else /* parent */ { /* pid hold id of child */ printf ( "PARENT: sending SIGHUP" ); kill(pid, SIGHUP); sleep(3); /* pause for 3 secs */ printf ( "PARENT: sending SIGINT" ); kill(pid, SIGINT); sleep(3); /* pause for 3 secs */ printf ( "PARENT: sending SIGQUIT" ); kill(pid, SIGQUIT); sleep(3); } } // sighup() function definition void sighup() { signal (SIGHUP, sighup); /* reset signal */ printf ( "CHILD: I have received a SIGHUP" ); } // sigint() function definition void sigint() { signal (SIGINT, sigint); /* reset signal */ printf ( "CHILD: I have received a SIGINT" ); } // sigquit() function definition void sigquit() { printf ( "My DADDY has Killed me!!!" ); exit (0); } |
输出:
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END