进程间通信之:管道
printf("Popen error\n");
exit(1);
}
while ((fgets(buf, BUFSIZE, fp)) != NULL)
{
printf("%s",buf);
}
pclose(fp);
exit(0);
}
下面是该程序在目标板上的执行结果。
$ ./standard_pipe
PID TTY Uid Size State Command
1 root 1832 S init
2 root 0 S [keventd]
3 root 0 S [ksoftirqd_CPU0]
……
74 root 1284 S ./standard_pipe
75 root 1836 S sh -c ps -ef
76 root 2020 R ps –ef
8.2.5 FIFO
1.有名管道说明
前面介绍的管道是无名管道,它只能用于具有亲缘关系的进程之间,这就大大地限制了管道的使用。有名管道的出现突破了这种限制,它可以使互不相关的两个进程实现彼此通信。该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当作普通文件一样进行读写操作,使用非常方便。不过值得注意的是,FIFO是严格地遵循先进先出规则的,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾,它们不支持如lseek()等文件定位操作。
有名管道的创建可以使用函数mkfifo(),该函数类似文件中的open()操作,可以指定管道的路径和打开的模式。
小知识 | 用户还可以在命令行使用"mknod 管道名 p"来创建有名管道。 |
在创建管道成功之后,就可以使用open()、read()和write()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。由于普通文件的读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。
(1)对于读进程。
n 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。
n 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。
(2)对于写进程。
n 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
n 若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。
2.mkfifo()函数格式
表8.4列出了mkfifo()函数的语法要点。
表8.4 mkfifo()函数语法要点
所需头文件 | #include <sys/types.h> | |
函数原型 | int mkfifo(const char *filename,mode_t mode) | |
函数传入值 | filename:要创建的管道 | |
函数传入值 | mode: | O_RDONLY:读管道 |
O_WRONLY:写管道 | ||
O_RDWR:读写管道 | ||
O_NONBLOCK:非阻塞 | ||
函数传入值 | mode: | O_CREAT:如果该文件不存在,那么就创建一个新的文件,并用第三个参数为其设置权限 |
O_EXCL:如果使用O_CREAT时文件存在,那么可返回错误消息。这一参数可测试文件是否存在 | ||
函数返回值 | 成功:0 | |
出错:-1 |
表8.5再对FIFO相关的出错信息做一归纳,以方便用户查错。
表8.5 FIFO相关的出错信息
EACCESS | 参数filename所指定的目录路径无可执行的权限 |
EEXIST | 参数filename所指定的文件已存在 |
ENAMETOOLONG | 参数filename的路径名称太长 |
ENOENT | 参数filename包含的目录不存在 |
ENOSPC | 文件系统的剩余空间不足 |
ENOTDIR | 参数filename路径中的目录存在但却非真正的目录 |
EROFS | 参数filename指定的文件存在于只读文件系统内 |
3.使用实例
下面的实例包含了两个程序,一个用于读管道,另一个用于写管道。其中在读管道的程序里创建管道,并且作为main()函数里的参数由用户输入要写入的内容。读
- Windows CE 进程、线程和内存管理(11-09)
- 如何监控和保护Linux下进程安全 (07-12)
- uClinux进程调度器的实现分析(04-13)
- linux操作系统下的进程通信设计(01-24)
- Windows操作系统多核CPU内核线程管理方法(01-21)
- 一种基于嵌入式实时操作系统的微机保护装置网络通信方案(05-07)