- 说明
Linux的管道通信分为无名管道和有名管道;无名管道只能应用到父进程与子进程之间;而有名管道可以用在任意两个进程之间。
2.管道学习
- 函数:
- 创建进程: fork , vfork
- 退出进程:exit
- 等待进程:wait
- 执行进程:exec, system
fork与vfork的对比
- 其共同之处是都可以创建子进程
- 不同之处:1、fork:子进程拥有独立的数据段、堆栈。 vfork:子进程与父进程共享数据栈和堆栈。
- 2、fork:父、子进程的执行次序不确定。 vfork:子进程先运行,父进程后运行。
有名管道通信
有名管道又称FIFO文件,因此可以采用文件操作方法去操作有名管道
- FIFO文件在使用上和普通文件有相似之处,但是也有不同之处:
1. 读取Fifo文件的进程只能以”RDONLY”方式打开fifo文件。
2. 写Fifo文件的进程只能以”WRONLY”方式打开fifo文件。
3. Fifo文件里面的内容被读取后,就消失了。但是普通文件里面的内容读取后还存在。
- 写程序
- /*
* 写fifo,即往fifo文件里写入数据
* 但必须创建有名管道(fifo)
* 然后打开进行写入操作
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
void main()
{
int fd;
int ret, ret1;
/* 创建FIFO文件 */
mkfifo("/tmp/myfifo",0666);
/* 打开fifo文件 */
fd = open("/tmp/myfifo",O_WRONLY);
/* 写入数据到fifo文件*/
ret = write(fd,"hello fifo",11);
close(fd);
} - 读程序
- #include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
void main()
{
char c_buf[15];
int fd;
fd = open("/tmp/myfifo",O_RDONLY);
read(fd,c_buf,11);
printf("read %s\n",c_buf);
close(fd);
unlink("/tmp/myfifo");
}