Linux进程间通信:信号量与中断信号处理

需积分: 34 9 下载量 94 浏览量 更新于2024-09-20 3 收藏 758B TXT 举报
"该实验是关于信号量机制的实践,主要目标是理解信号在Linux系统中的作用以及进程间通信的基本原理。实验通过创建并管理两个子进程,利用fork()、signal()、kill()等系统调用来实现进程间的交互。当父进程捕获到键盘中断信号(SIGINT,即Ctrl+C)后,向子进程发送自定义信号,子进程接收到信号后执行相应的操作,最终所有进程终止。实验代码中还涉及到了lockf()函数来实现锁的控制。" 在这个实验中,我们关注以下几个关键知识点: 1. **信号(Signal)**:信号是一种异步事件通知机制,用于进程间通信。在本实验中,父进程通过`signal(SIGINT, stop)`注册了一个信号处理函数stop,以便在接收到SIGINT信号(Ctrl+C)时执行特定操作。 2. **fork()系统调用**:用于创建新进程。在主程序中,首先调用fork()创建第一个子进程p1,然后在父进程中再次调用fork()创建第二个子进程p2。这样就形成了一个父进程、一个子进程p1和另一个子进程p2的结构。 3. **进程间通信(IPC, Inter-Process Communication)**:实验中通过信号进行进程间的通信。父进程捕获到键盘中断信号后,使用kill()向子进程发送自定义信号(10和12)以通知它们。 4. **kill()系统调用**:向指定进程发送信号。父进程在捕获到中断信号后,使用kill()分别向子进程p1和p2发送信号10和12。 5. **信号处理函数**:通过`signal()`注册,当进程接收到特定信号时,会调用指定的处理函数。在实验中,`stop()`函数用于处理信号,将`wait_mark`变量设为0,表示进程已接收到信号。 6. **自定义信号**:kill()调用中的10和12是自定义信号,不同于标准的信号(如SIGINT)。子进程通过注册对应的信号处理函数来响应这些自定义信号。 7. **lockf()函数**:用于实现锁的控制。在实验中,lockf()用于控制进程的同步,确保子进程按照预期顺序执行。`lockf(1, 1, 0)`和`lockf(1, 0, 0)`分别用于获取和释放锁。 8. **wait()和wait_mark变量**:`wait()`系统调用用于等待子进程结束,而`wait_mark`变量作为同步标志,确保子进程在执行完特定操作后才退出。 通过这个实验,我们可以深入理解信号在进程间通信中的作用,以及如何通过系统调用和自定义函数来控制进程的行为。这有助于我们在实际开发中更好地理解和运用进程通信机制。