在linux中,一切文件!
无名管道也是一种文件,无名管道用于具有血缘关系的进程之间,为半双工模式。我们可以想象一下,一个管道有两端,一个用来写入数据,另一个用来读取数据,无名管道用int pipe(int pipefd[2])函数创建,可用man 2 pipe在Linux中查看函数详情。因此,无名管道在创建成功后,会生成两个文件描述符,一个用来指向读端口,一个指向写端口,这两个文件描述符放在长度为2的数组中,其中第0个元素表示的整数为写文件的描述符,第1个元素的整数位读文件的描述符:
如下是demo函数:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void read_data(int *);
void write_data(int *);
int main(int argc, char *argv[])
{
int pipes[2];//pipe[0]用于读,pipe[1]用于写
int rc;
pid_t pid;
rc = pipe(pipes);
if(rc == -1)
{
perror("\npipes\n");
exit(1);
}
pid = fork();
switch(pid)
{
case -1:
perror("\nfork\n");
exit(1);
case 0: //子进程
read_data(pipes);
default://父进程
write_data(pipes);
}
return 0;
}
void read_data(int pipes[])
{
int c,rc;
close(pipes[1]);//关掉写
while((rc = read(pipes[0], &c ,1)) > 0)
{
putchar(c);
}
exit(0);
}
void write_data(int pipes[])
{
int c ,rc;
close(pipes[0]);//关掉读
while((c = getchar()) > 0)
{
rc = write(pipes[1], &c, 1);
if(rc == -1)
{
perror("\nwrite\n");
close(pipes[1]);//关掉写
exit(1);
}
}
close(pipes[1]);//关掉写
exit(0);
}
这个函数的功能是在父进程中向无名管道写入数据,在子进程中读取出来。
编译该函数,生成名为pipe的文件,运行pipe文件:
实际的效果为,你输入什么字符串,终端就显示什么字符串。