进程间通信中信号详解
时间: 2023-12-20 15:09:07 浏览: 163
在进程间通信中,信号是一种非常重要的机制。它可以让一个进程向另一个进程发送一个异步通知,让接收进程执行特定的操作。
信号的基本概念是:当一个进程需要通知另一个进程发生了某个事件时,它可以向另一个进程发送一个信号。接收进程在接收到信号后,可以选择忽略该信号或者执行相应的处理程序。
信号可以由如下几种方式发送:
1. kill命令:可以使用kill命令向指定进程发送信号。
2. 信号函数:可以使用信号函数向指定进程发送信号。
3. 软件异常:当一个进程执行某些非法操作时,操作系统会向该进程发送一个信号。
常见的信号有:
1. SIGINT:中断进程。通常由Ctrl+C键触发。
2. SIGTERM:请求进程终止。通常由kill命令发送。
3. SIGKILL:强制进程终止。通常由kill命令发送。
4. SIGSTOP:暂停进程。通常由kill命令发送。
5. SIGCONT:恢复进程。通常由kill命令发送。
6. SIGUSR1和SIGUSR2:用户自定义信号。
在Linux系统中,可以使用kill命令向指定进程发送信号。例如:
```
kill -SIGINT pid
```
这个命令会向指定pid的进程发送SIGINT信号,让该进程接收到信号后执行相应的处理程序。
在编写程序时,可以使用信号函数向指定进程发送信号。例如,下面的代码向指定进程发送SIGUSR1信号:
```
#include <signal.h>
#include <unistd.h>
int main()
{
int pid = 12345; // 指定进程的pid
kill(pid, SIGUSR1); // 向指定进程发送SIGUSR1信号
return 0;
}
```
当接收进程接收到信号后,可以执行相应的处理程序。例如,下面的代码定义了一个信号处理程序,当接收到SIGUSR1信号时会执行该处理程序:
```
#include <signal.h>
void handle_signal(int signum)
{
// 处理SIGUSR1信号
}
int main()
{
signal(SIGUSR1, handle_signal); // 注册信号处理程序
while(1) {} // 循环等待信号
return 0;
}
```
上面的代码中,signal函数用于注册信号处理程序,当接收到SIGUSR1信号时会执行handle_signal函数。循环部分是为了等待信号的到来。
阅读全文