Day31、未决信号、有名管道、IPC进程间通讯(消息队列)

本文介绍了Linux系统中未决信号的概念及其检测方法,包括`sigpending`函数的使用。同时,详细讲解了有名管道(FIFO)的创建和使用,展示了如何通过有名管道实现两个进程之间的数据通信。最后,讨论了进程间通信(IPC)的其他方式,如消息队列,并提供了`ftok`和`msgget`等函数的使用示例。
摘要由CSDN通过智能技术生成

补充:

html

apache(web)

C语言写网站后台程序,称作CGI

 

今天:

一、            未决信号

定义:从信号的产生到信号的到达,在这期间叫做未决信号

sigpending(2)

#include <signal.h>

int sigpending(sigset_t *set);

功能:检查未决信号,将信号集里的未决信号的相应位置1

参数:

set:信号集 (值_结果参数)

返回值:

成功返回0,失败返回1

举例:vi pending.c

  1 #include<stdio.h>

  2 #include<signal.h>

  3 int main(){

  4     sigset_t set;

  5     sigset_t pset;

  6     //清空set

  7     sigemptyset(&pset);

  8     sigemptyset(&set);

  9     //将信号添加到集合set里

 10     sigaddset(&set,SIGINT);

 11     //设置信号的屏蔽

 12     sigprocmask(SIG_SETMASK,&set,NULL);

 13     sleep(10);

 14     //获取未决信号

 15     sigpending(&pset);

 16     //判断SIGINT是不是未决信号

 17     if(sigismember(&pset,SIGINT)==1){//一次检测一个,这次检测SIGINT,若要检测其他信号,再写if语句

 18         printf("SIGINTpending...\n");

 19     }

 20     return 0;

 21 }            

tarena@tarena-virtual-machine:~/day31$./a.out

^CSIGINT pending...

作用:在休眠10s内输入ctrl+c,没有反应(阻塞),最后判断SIGINT是不是未决信号

输入ctrl+c产生了信号,但是被sigprocmask设置屏蔽,此时的信号就是未决信号

改变:

  1#include<stdio.h>

  2#include<signal.h>

  3int main(){

 4     sigset_t set;

 5     sigset_t pset;

 6     //清空set

 7     sigemptyset(&pset);

 8     sigemptyset(&set);

 9     //将信号添加到集合set里

 10    sigaddset(&set,SIGINT);

 11    //设置信号的屏蔽

 12//   sigprocmask(SIG_SETMASK,&set,NULL);

 13    sleep(10);

 14    //获取未决信号

 15    sigpending(&pset);

 16    //判断SIGINT是不是未决信号

 17    if(sigismember(&pset,SIGINT)==1){

 18        printf("SIGINT pending...\n");

 19     }

 20    return 0;

 21 }

tarena@tarena-virtual-machine:~/day31$./a.out

^C

作用:12 //    sigprocmask(SIG_SETMASK,&set,NULL); 

没有屏蔽ctrl+c的命令,即在睡眠期间,可以接受信号,按下ctrl+c就可以执行打断功能,就不存在未决信号。

二、                                有名管道

创建一个管道文件,一个进程往这个文件里写数据,一个进程从这个文件里读取数据,就此完成了两个进程间的通讯。

文件比较特殊,这个文件只是作为进程间通讯使用,文件的大小为0

管道的创建:

mkfifo(3)

#include<sys/types.h>

#include<sys/stat.h>

int mkfifo(const char*pathname, mode_t mode);

功能:创建一个管道文件

参数:

pathname:文件的路径

mode:文件具有的权限,需要考虑umask

返回值:0成功,-1失败,errno被设置

举例:processA.c 先执行,在这个进程中创建管道,往管道里写内容

 processB.c 后执行,从管道里读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值