- 管道的定义
- 进程管道
- 管道调用
- 父进程子进程
- 命名管道;FIFO,LIFO
- 客户\服务器架构
从一个进程连接数据流到另外一个进程时,我们使用术语管道(pipe)。比如shell中的
cmd1 | cmd2
其实最简单的两个程序之间的传递数据的方法就是使用popen pclose函数,原型如下
#include <stdio.h>
FILE *popen(const char *command,cosnt char *open_mode);
int pclose(FILE *stream_to_close);
这里大家就可以man一下了。我就不详细说明了
/
//
// CopyRight © Peace & Love 2019.3.29
// Option:descripte the pipe usage
// Autor:Lai Sky
// Email:zixing_sky@163.com
//
/
#include <unistd.h>
//int pipe(int file_descriptor[2]);
//通过这个函数在两个程序之间传递数据不需要启动一个shell来解释请求的命令
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
int data_processed;
int file_pipes[2];
const char some_data[] = "123";
char buffer[BUFSIZ + 1];
memset(buffer,'\0',sizeof(buffer));
/*
如果EMFILE:进程使用的文件描述符过多
ENFILE:系统的文件表已满
EFAULT:文件描述符无效
成功返回0;
两个返回的文件描述符以一种特殊的方式连接起来。写到file_descriptor[1]的所有数据都可以从[0]读回来。因为时间基于先进先出原则(FIFO)进行处理。栈采用后进先出原则,通常是LIFO;
*/
if(pipe(file_pipe) == 0)
{
data_processed = write(file_pipes[1],some_data,strlen(some_data));
printf("Wrote %d bytes\n",data_processed);
data_processed = read(file_pipes[0],buffer,BUFSIZ);
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}
//调用fork()来调用pipe()
//about fork
//https://www.cnblogs.com/dongguolei/p/8086346.html
int fork_pipe()
{
int data_processed;
int file_pipe[2];
const char some_data[] = "123";
char buffer[BUFSIZ + 1];
pid_t fork_result;
memset(buffer,'\0',sizeof(buffer));
if(pipe(file_pipes) == 0)
{
fork_result = fork();
if(fork_result == -1)
{
fprintf(stderr,"Fork failure");
exit(EXIT_FAILURE);
}
if(fork_result == 0) {
data_processed = read {file_pipes[0],buffer,BUFSIZ};
printf("Read %d bytes:%s\n",data_processed,buffer);
exit(EXIT_SUCCESS);
}else {
data_processed = write(file_pipes[1],some_data,strlen(some_data));
printf("Wrote %d bytes\n",data_processed);
}
}
exit(EXIT_SUCCESS);
}
//help:这个程序首先用pipe调用创建一个管道,接着用fork调用创建一个新进程,如果调用成功,父进程就写数据到管道中,而子进程从管道中读取数据。父进程都在只调用一次write或者read之后就退出。如果父进程在子进程之前退出,就会在两部分输出内容之间看到shell提示符$
调用fork之后的情况
程序做好数据传输准备之后的情况
命名管道:FIFO
命名管道是一种特殊的类型文件,在文件系统中以文件名的形式存在。可以使用命令行上创建命名管道,也可以在程序中创建它。
mknod filename p
或者
mkfifo filename (推荐使用这个)
包含头文件
#include <sys/types.h>
#include <sys/stat.h>
int main()
{
int res = mkfifo("/tmp/my_fifo",0777);
if(res == 0) printf("fifo created!!\n");
exit(EXIT_SUCCESS);
}
然后执行程序
ls -lF /tmp/my_fifo
prxwr-xr-x 1 rick users 0 2019-3-29-16:30 /tmp/my_fifo |
输出的第一个字母就是管道p
之后就可以访问管道了
cat < /tmp/my_fifo
echo "hello sky" > /tmp/my_fifo
注意:cat命令一直被挂起,直到ctrl+c中断它或者读到信息
就可以看到输出
突然看到通知说明天要开题。哈哈哈改成周日了,开心出游