嵌入式学习第二十八天(有名管道和信号signal)

无名管道:只能用于亲缘关系进程之间的通信

有名管道:1、存在于内存中

                  2、在系统中有一个对应名称

                  3、文件大小 0bytes

FIFO文件被打开,就可以使用与操作匿名管道和其它文件的系统调用一样的I/O系统调用,如使用 read()读数据write()写数据close()关闭FIFO等。

与匿名管道一样,FIFO也有一个写入端和读取端,且从管道中读取数据的顺序与写入数据的顺序是一样的。FIFO的名称也由此而来:先入先出,也是一个环形队列。

 创建有名管道:

     方式1:可以使用命令创建有名管道:

     mkfifo 名字;

     方式2:

     使用函数mkfifo()函数创建有名管道

使用mkfifo()创建了FIFO后,就可以使用open()打开它,常见的文件I/O函数都可以用于FIFO。

FIFO严格遵循先进先出,对FIFO的读总是从开始处返回数据,对FIFO的写则是把数据添加到末尾,FIFO不支持lseek()等文件定位的函数。

函数:mkfifo

  • 参数说明:
    • pathname:管道名称的路径;
    • mode:FIFO的权限,和open是一样的;如0666;
  • 返回值:成功返回0,失败返回-1,并设置对应的errno;
 有名管道的注意事项

     1、一个进程以只读打开管道会阻塞,直到另外一个进程以只写打开管道;

     2、一个进程以只写打开管道会阻塞,直到另外一个进程以只读打开管道;

读管道:
        管道中有数据,read返回实际读到的字节数;
        管道中无数据:        
        管道写端被全部关闭,read返回0,相当于读到文件末尾;
        管道写端没有被全部关闭,read阻塞等待;
写管道:
        管道读端全部关闭,进程异常终止,收到信号SIGPIPE;
        管道读端没有被全部关闭:
        管道已经满了,write阻塞等待
        管道没有满,write将数据写入,并返回实际写入的字节数

信号的机制
       A 给 B 发送信号,B 收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为“软中断”。
       信号的特质:由于信号是通过软件方法实现,其实现手段导致信号有很强的延时性。但对于用户来说,这个延迟时间非常短,不易察觉。

       每个进程收到的所有信号,都是由内核负责发送的,内核处理!

每个信号都有一个名字和编号,这些名字都以“SIG”开头,例如“SIGIO ”、“SIGCHLD”等等。
信号定义在signal.h头文件中,信号名都定义为正整数。
具体的信号名称可以使用kill -l来查看信号的名字以及序号,信号是从1开始编号的,不存在0号信号。kill对于信号0又特殊的应用。

信号的处理有三种方法,分别是:忽略 、捕捉 和 默认动作

注册和处理函数:

 sighandler_t    signal (   int  signum,    sighandler_t  handler);

signum 是信号的编号,handler 是中断函数的指针。

信号发送函数

   int kill (  pid_t  pid ,  int  sig );

pid:进程的pid号

sig: 信号的编号

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值