内容: 记录进程间通信的另一种方式:信号
发送信号接口:
int kill(pid_t pid, int sig);
返回值说明:
执行成功时:返回0
执行失败时:返回-1;并且errno被设为以下的某个值 :
1、EINVAL:指定的信号码无效(参数 sig 不合法)
2、EPERM;权限不够无法传送信号给指定进程
3、ESRCH:参数 pid 所指定的进程或进程组不存在
形参说明:
pid:可能选择有以下四种
1、 pid>零时,pid是信号欲送往的进程的标识。
2、 pid=零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
3、 pid=-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。
4、pid<-1时,信号将送往以-pid为组标识的进程。
sig:要发送的信号
注册信号处理函数接口:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signum:注册的信号
handler:为signum信号准备的处理函数
(某些linux系统,signal注册后只生效一次,下一次该信号到来就恢复默认处理方式)
推荐使用:sigaction,该函数功能相对signal而言,能够提供更多功能。
代码实践:
//发送端
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int pid;
int sig;
printf("please input the pid of the target process \n");
scanf("%d", &pid);
printf("please input the signal that you want to send \n");
scanf("%d", &sig);
while (1)
{
kill(pid, sig);
sleep(1);
}
return 0;
}
//接收处理端
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
void sigroutine(int dunno)
{
/* 信号处理例程,其中dunno将会得到信号的值 */
printf("Get a signal -- SIGINT \n");
return;
}
int main() {
printf("process id is %d ",getpid());
signal(SIGINT, sigroutine);
for (;;) ;
return 0;
}
执行结果:
启动接收端程序,然后查看pid:
使用发送端不断发送信号:
查看接收端:
更多sigaction的细节可以看以前写过的:
注册信号处理的两种方式
大四学生一枚,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。有喜欢C/C++,linux的同学欢迎私信一起讨论学习。