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).