管道和FIFO

管道分为两种,普通的管道,和有名管道(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。发送消息结构

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值