管道和FIFO

    技术2022-05-19  25

    管道分为两种,普通的管道,和有名管道(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)