【博客169】IPC(进程间通信)——信号

内容: 记录进程间通信的另一种方式:信号

发送信号接口:

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的同学欢迎私信一起讨论学习。

发布了217 篇原创文章 · 获赞 41 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_43684922/article/details/104463683