Linux进程通信:Ctrl+C中断与子进程控制

4星 · 超过85%的资源 需积分: 9 9 下载量 60 浏览量 更新于2024-10-11 收藏 1KB TXT 举报
"本文将深入探讨进程通信中的软中断机制,通过一个具体的示例来解释如何使用`fork()`、`signal()`、`kill()`等系统调用来实现进程间的交互。在给定的代码中,创建了两个子进程,并且通过键盘输入的中断信号(Ctrl+c)来触发父进程发送信号给子进程,最终实现特定的信息输出和进程的终止。" 在操作系统中,进程是执行中的程序实例,它们可能需要相互之间进行通信以完成复杂的任务。软中断是一种在内核中处理事件的方式,通常与硬件中断相对,它不是由硬件事件直接触发,而是由软件(如用户态进程或内核)生成的。在本示例中,软中断被用来实现进程间的通信。 首先,父进程使用`fork()`系统调用创建两个子进程。`fork()`会复制当前进程的所有状态,包括内存、文件描述符等,并返回两次,一次在父进程中返回新创建子进程的PID,一次在子进程中返回0。如果返回值是-1,则表示`fork()`失败。 接下来,父进程和子进程都使用`signal()`来设置对特定信号的处理方式。在这个例子中,父进程设置了对`SIGINT`(中断信号,通常是Ctrl+c产生的)的处理函数为`stop`,而子进程则忽略这个信号,以便在接收到信号时不会立即终止。同时,子进程设置了对信号16和17(非标准信号,可能是自定义的)的处理函数为`stop`,这将在信号到来时更改`wait_mark`变量的值,从而唤醒等待的进程。 `wait_mark`变量是一个同步原语,用于在子进程中进行忙等待,直到接收到信号为止。在`waiting()`函数中,子进程会循环检查`wait_mark`是否为1,如果是,则继续等待;否则,继续执行后续操作。 当父进程接收到`SIGINT`信号后,调用`kill()`发送信号16和17给两个子进程。`kill()`函数用于向指定的进程发送信号,这里的16和17对应子进程设置的自定义信号。子进程在接收到信号后,`stop`函数会被调用,改变`wait_mark`的值,使子进程退出等待状态,继续执行并打印出相应的信息,然后通过`exit(0)`退出进程。 最后,父进程等待两个子进程结束,使用`wait(0)`系统调用等待任何子进程终止。两次`wait(0)`确保父进程等待所有子进程结束。当所有子进程结束后,父进程打印出“Parent Process is Killed!”,然后也通过`exit(0)`退出。 这个示例展示了如何通过软中断和信号机制实现进程间的通信和控制。通过这样的方式,父进程可以影响子进程的行为,子进程也可以根据接收到的信号做出响应,进而协调进程间的操作。这种通信机制在多进程编程中非常常见,尤其是在需要进程间同步和控制的场景下。