管道分为两种,普通的管道,和有名管道(FIFO)。
普通管道:
局限于有亲缘关系的进程;
需求:
客户 服务
pipe入参是个数组,
主程序
pipe();
close();
fork();
waitpid();
pid_t;
服务端函数:
客户端函数:
-----------------------------------------------------------------------------
1.简单客户服务端流程图 读取指定文件内容
2.单个进程中管道图;父子进程管道图;;一个shell管道线,三个进程图,who|sort|lp
双向数据流的两个管道图;
3.创建两个管道, 客户端为父进程,服务端为子进程,客户端发指令,服务端读文件;
1)如何从标准输入读入内容------fets(数组, 要读入的长度,但不是sizeof(数组),stdin);
fgets 会在读进的内容最后加/n
2) read 函数 一般用法 : while((n=read(文件描述符,数组,长度))>0),因为当read返回0表示已经到文件尾
3)将内容在标准输出显示 write(1,数组,长度)
4)一般用fd表示文件描述符,例如readfd ,writefd
5) buf[n]='/0'; '/0'
6) fd=open(路径,O_RDONLY) 问题,open成功返回0,这里的fd是0??
7) fork 出的子进程要记得exit,主进程中要记得 waitpid
8)main函数之前,声明所用的函数,如果两个函数,入参,返回值相似,可以一起声明:
void client(int ,int), server(int,int);
9)将main,client,server三个函数分别写在三个. 文件中,写一个makefile,
写makefile的时候一定要注意格式
client: client.c 这里要顶格写
tab键 xlc -c client.c
如果没有按要求会报错:make: Shell command not associated with a dependency:pipe: pipe.o client..
10)stdin 如果传入一个函数,那么接收stdin的参数可以为FILE *stream类型
4.全双工管道,图,和代码;
1)两个半双工
5.用cat命令实现客户服务端功能,所用函数popen,pclose
popen返回的是FILE *
fgets第三个参数也是FILE *
要建立 FILE *fd;而不是 FILE fd;
否则会报错:
"popen.c", line 20.11: 1506-068 (S) Operation between types "struct {...}" and "struct {...}*" is not allowed.
"popen.c", line 24.33: 1506-280 (S) Function argument assignment between types "struct {...}* restrict" and "struct {...}" is not allowed.
"popen.c", line 27.16: 1506-280 (S) Function argument assignment between types "struct {...}*" and "struct {...}" is not allowed.
用pclose关闭popen打开的标示符;
6.用两个FIFO管道实现客户服务端(有亲缘关系),图;
EEXIST 在 #include <errno.h>
S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH 在 #include <sys/stat.h>
unlink
7.用两个FIFO管道实现客户服务端(无亲缘关系)
在HP下编译,没有问题,可能会出错的地方,最后一个}后要加一个回车换行
不然会报错
warning #2001-D: last line of file ends without a newline
}
误写unlink(writefd);应该为unlink(fifo2);竟然没有编译报错?!
在AIX下编译,一开始报的错误没有了,奇诡~
8.调用fcntl函数,取得文件状态
9.单个服务器,多个客户 fifo实现,图
1)
ptr=strchr(buf,(int)" ")
第二个参数是int型,所以要强制转换
2)
makefile问题:HP下面,编译一个c文件,用makefile总是报错
. Stop.n't know how to make servi.c
用shell就可以了,是不是一个源文件生成程序,不可以用makefile
3)
在AIX上编译报错,不知道是不是系统头文件问题 :
"/usr/include/fcntl.h", line 216.24: 1506-275 (S) Unexpected text string literal encountered.
10。发送消息结构