第三课 进程间通信学习(管道通信,信号通信)

  

   1. 管道通信,在前面已近学过一点管道的知识,这里只介绍有名管道。

       我觉得这里有名管道的通信,其实就相当于通过共享一个文件,通过这个文件来共享数据。

    函数原型: mkfifo (const char *filename, mode_t mode)

    MODE :  O_RDONLY 

                  O_WRONLY

                  O_RDWR

                  O_NONBLOCK 非阻塞标志

                  O_CREAT 创建管道文件,如果不存在,默认设置为 RW权限

                  O_EXCL  测试管道文件是否存在

   这里的MODE 影响的是 创建管道文件的权限和方式...

       网上 有解释说 参数mode为该文件的权限(mode % ~ umask) ... 那么这到底是怎么操作的呢?

    老样子,我先查看源文件:

   

 从源文件中可以看到 mode 是和 S_IFIFO 做或操作,那么 S_IFIFO 是什么呢?

 使用google 代码搜索,可以搜索这样一段注释,这是存在sysv_fs.h的头文件中,

   

 

从这里可以看到 S_IFIFO 值就是 为了使MODE 第5位置1,表示的类型是有名管道

 

貌似没有查到关键...

那么我们继续顺藤摸瓜查下去 查 __xmknod  函数的具体实现

       

可以看到最后内联系统调用 mknod 函数

    

 

 

  然后mode 的寿命到这里就结束了....回头我们再看mode 作用,传递一个创建管道的信息...

  那仅仅是传递一个信息么? 我也不知道.. 实际使用mkfifo 函数的时候,权限基本上很少考虑,直接设置好阻塞标志和文件存在标志就用了,如果你增加或者直接修改使用 只读或者只写方式创建管道,照样你也可以使用它来读写,我并没有感觉受到任何约束....

  很神奇吧?嘿嘿..

 

  下面是关于出错的信息:

EACCESS 参数pathname所指定的目录路径无可执行的权限
EEXIST 参数pathname所指定的文件已存在。
ENAMETOOLONG 参数pathname的路径名称太长。
ENOENT 参数pathname包含的目录不存在
ENOSPC 文件系统的剩余空间不足
ENOTDIR 参数pathname路径中的目录存在但却非真正的目录。
EROFS 参数pathname指定的文件存在于只读文件系统内。

 

   2.信号通信

     发送信号的函数 kill raise alarm pause 等

     kill(pid_t pid, int sig);

     sig 信号可以是 常见信号列表中的任意一种....可以向任意进程发送 信号

     raise(int sig);

     则只能给本身进程发送信号..

     alarm 则是定时器,时间一到就向进程发送sigalarm 前提是定时器所在进程自己并没有结束,否则没有人会代替 alarm 来发送这个 信号的..所以当时间一到,没有收到这个信号的时候,一定要检查定时器所在进程是否还存活...

     pause 函数则是想到与一个开关,将调用的进程挂起,直到捕捉到信号为止。

 

 

     课后习题:

    

     编写运行以下程序

 

① 使用signal()函数编写一个程序,功能为当按下"Ctrl+C"按键后在屏幕上打印出"How are you ?"

② 使用signal()函数和alarm()函数编写一个程序,功能为当程序运行5秒后在屏幕上打印出"How are you ?"

③ 使用signal()函数编写一个程序,功能为当第一次按下"Ctrl+C"按键后在屏幕上打印出"How are you ?";

当第二次按下"Ctrl+C"按键后,系统会中断进程的运行。

提示:SIG_DFL信号为重新恢复系统对SIGINT信号的默认处理,可使用语句(void)signal(SIGINT,SIG_DFL).

 

 

   

 

 

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值