8:管道
8.1 无名管道
无名管道通常直接称之为管道,它占用两个文件描述符,不能被非血缘关系
的进程共享,一般应用在父子进程中
8.2 无名管道的建立
#include <unistd.h>
int pipe (int fildes[2]);
函数pipe在内核中创建一个管道,并分配两个文件描述符标识管道的两端,
这两个文件描述符存储于fildes[0],fildes[1]中,一般约定fildes[1]
描述管道的输入端,进程向此文件描述符中写入数据,fildes[0]描述管道
的输出端,调用成功返回0,否则返回-1.
8.3 从父进程流向子进程的管道
1.创建管道
int fildes[2];
pipe(fildes);
2.创建子进程,子进程继承父进程的管道文件描述符(p210图)
3.父进程关闭管道的输出端,即fildes[0]
close(fildes[0]);
4.子进程关闭fildes[1]
close(fildes[1])
8.4 popen模型
#include <stdio.h>
FILE *popen (const char *command, char *type);
int pclose (FILE *stream);
popen首先fork一个子进程,然后调用exec执行参数command中给定的shell
命令,不同的是,函数popen自动在父进程与子进程之间建立了一个管道,
这个管道可以链接子进程的标准输入,也可以链接输出,取决于type:
r 管道数据由子进程流向父进程
w 管道数据由父进程流向子进程
8.5 有名管道的建立
1.mknod创建管道
mknod name p 创建管道文件
mknod name s 创建信号量
mknod name m 创建共享内存
例1:创建有名管道k1
mknod k1 p;
2.命令mkfifo创建管道
mkfifo [-m mode] file...
mode 是管道文件创建后的访问权限,file是管道文件创建后的名称
例1:创建一个用户本身可读写,其他用户只读的管道文件k2
mkfifo -m 644 k2;
3.函数mkfifo创建管道
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(char *path, mode_t mode);
mode 取值类似open的第三个参数,并且自带了O_CREAT,O_EXCL选项
8.1 无名管道
无名管道通常直接称之为管道,它占用两个文件描述符,不能被非血缘关系
的进程共享,一般应用在父子进程中
8.2 无名管道的建立
#include <unistd.h>
int pipe (int fildes[2]);
函数pipe在内核中创建一个管道,并分配两个文件描述符标识管道的两端,
这两个文件描述符存储于fildes[0],fildes[1]中,一般约定fildes[1]
描述管道的输入端,进程向此文件描述符中写入数据,fildes[0]描述管道
的输出端,调用成功返回0,否则返回-1.
8.3 从父进程流向子进程的管道
1.创建管道
int fildes[2];
pipe(fildes);
2.创建子进程,子进程继承父进程的管道文件描述符(p210图)
3.父进程关闭管道的输出端,即fildes[0]
close(fildes[0]);
4.子进程关闭fildes[1]
close(fildes[1])
8.4 popen模型
#include <stdio.h>
FILE *popen (const char *command, char *type);
int pclose (FILE *stream);
popen首先fork一个子进程,然后调用exec执行参数command中给定的shell
命令,不同的是,函数popen自动在父进程与子进程之间建立了一个管道,
这个管道可以链接子进程的标准输入,也可以链接输出,取决于type:
r 管道数据由子进程流向父进程
w 管道数据由父进程流向子进程
8.5 有名管道的建立
1.mknod创建管道
mknod name p 创建管道文件
mknod name s 创建信号量
mknod name m 创建共享内存
例1:创建有名管道k1
mknod k1 p;
2.命令mkfifo创建管道
mkfifo [-m mode] file...
mode 是管道文件创建后的访问权限,file是管道文件创建后的名称
例1:创建一个用户本身可读写,其他用户只读的管道文件k2
mkfifo -m 644 k2;
3.函数mkfifo创建管道
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(char *path, mode_t mode);
mode 取值类似open的第三个参数,并且自带了O_CREAT,O_EXCL选项