linux管道学习(一)

最近学习了管道 pipe,在这里进行一下总结。

这里贴一段自己的实做代码

struct node{
int a;
long b;
};

int main()
{
    int field[2];
    pid_t pid;
    char buf[256];
    int returned_count;

    pipe(field);
    //fcntl(field[0], F_SETFL, O_NONBLOCK);
    int status;
    pid = fork();
    if(pid < 0)
    {
        printf("Error In Fork\n");
        exit(1);
    }
    if(pid == 0)
    {
        printf("In Child Process\n");
        close(field[0]);
        node testnode;
        testnode.a = 1;
        testnode.b = 2;
        //sleep(10);
        //write(field[1],"This is a pipe test\n",strlen("This is a pipe test"));
        //write(field[1],"This is another pipe test\n",strlen("This is another pipe test"));
        write(field[1],&testnode,sizeof(testnode));
        testnode.a = 10;
        testnode.b = 20;
        write(field[1],&testnode,sizeof(testnode));
        exit(0);
    }
    else
    {
        printf("In Parent Process\n");
        close(field[1]);
        //read(field[0],buf,sizeof(buf));
        node ptestnode;
        read(field[0],&ptestnode,sizeof(node));
        //printf("Msg %s from Child\n",buf);
        printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b);

        read(field[0],&ptestnode,sizeof(node));
        printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b);
        //waitpid(pid,&status,0);
    }

    close(field[1]);
}

pipe作为linux进程通讯中的一种常用手段被广泛使用,函数原型为int pipe(int filedes[2]); 其中filedes中的filedes[0]代表读 filedes[1]代表写。

再不使用fcntl函数限定的情况下,管道默认是以阻塞方式进行的。

比如父进程再使用read函数读取管道内容时,如果管道为空,则read函数会阻塞等待。如果将管道设置为读非阻塞,则父进程读取不到管道内容会直接进行下一步,不再等待。

但是父进程中如果使用了wait或waitpid函数,我发现实现效果依然和管道阻塞的情况一样,等待子进程写入,读取内容后才会进行下一步,这点有待研究。

通过read的返回值来进行判断管道中的内容是否读取完毕。

例如

 1 node ptestnode;
 2         int bufcount = 0;
 3         bufcount = read(field[0],&ptestnode,sizeof(node));
 4         //printf("Msg %s from Child\n",buf);
 5         printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b);
 6
 7         while(bufcount)
 8         {
 9             bufcount = read(field[0],&ptestnode,sizeof(node));
10             if(!bufcount)
11             {
12                 break;
13             }
14             printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b);
15         }
16
17         printf("Pipe Read Over\n");
时间: 2024-08-06 03:30:39

linux管道学习(一)的相关文章

linux管道学习(二)

1 int main() 2 { 3 char* pipename = "pipe"; 4 mkfifo(pipename,0777); 5 int pid = fork(); 6 if(pid < 0) 7 { 8 printf("Error In Fork\n"); 9 exit(-1); 10 } 11 12 if(pid == 0) 13 { 14 printf("In Child Process\n"); 15 int fd =

Linux IPC(Inter-Process Communication,进程间通信)之管道学习

1.标准流管道 管道操作支持文件流模式,用来创建链接还有一个进程的管道,通过函数popen和pclose popen的详细介绍在本blog:Linux 多进程学习中有具体介绍 2.无名管道(PIPE) 特点: 1)仅仅能在亲缘关系进程间通信(父子或兄弟) 2)半双工(固定的读端和固定的写端) 3)是特殊文件,能够用read,write等,在内存中 管道函数原型: #include<unistd.h> int pipe(int fds[2]); 管道在程序中用一对文件描写叙述符表示,一个是可读属

Linux程序设计学习笔记----进程间通信——管道

转载请注明出处: http://blog.csdn.net/suool/article/details/38444149, 谢谢! 进程通信概述 在Linux系统中,进程是一个独立的资源管理单元,但是独立而不孤立,他们需要之间的通信,因此便需要一个进程间数据传递.异步.同步的机制,这个机制显然需要由OS来完成管理和维护.如下: 1.同一主机进程间数据交互机制:无名管道(PIPE),有名管道(FIFO),消息队列(Message Queue)和共享内存(Share Memory).无名管道多用于亲

Linux 程序设计学习笔记----进程管理与程序开发(下)

转载请注明出处:http://blog.csdn.net/suool/article/details/38419983,谢谢! 进程管理及其控制 创建进程 fork()函数 函数说明具体参见:http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html 返回值:Upon successful completion, fork() shall return 0 to the child process and shall re

Linux 程序设计学习笔记----终端及串口编程基础之概念详解

转载请注明出处,谢谢! linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络. 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1.终端 一台主机,连很多终端,终端为主机提供了人机接口,每个人都通过终端使用主机的资源. 终端有字符哑终端和图形终端两种. 控制台是另一种人机接口, 不通过终端与主机相连, 而是通过显示卡-显示器和键盘接口分别与主机相连, 这是人控制主机的第一人机接口.

【转】十分有用的linux shell学习总结

在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们 数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux Shell的系列博客就给予了我极大的帮助,然而在实际的使用中却发现,有的时候确实忘记了某个技术点或某个Shell命令的使用方式曾经在哪一篇博客中 予以了说明,所以不得不多次点击多篇博客,直到找到想要那篇的为止,鉴于此,为了方便我们每个人的查阅,这里特别给出了前十二篇系列博客的目录以供大家参 阅和查

Linux系统学习笔记:序

Linux系统学习笔记:序 ??Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协议.它支持32位和64位硬件.Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统. 本人使用的Linux为Ubuntu,主要以<APUE>(第3版)为学习蓝本. 1. Unix/Linux 体系结构 如图: 内核的接口被称为系统调用.公用函数库构建在

Linux 多进程学习

1Linux进程概述 进程是一个程序执行一次的过程,他和程序有着本质的区别.程序是静态的,他是一些保存在磁盘上的指令有序的集合. 进程是动态的概念,他是运行者的程序,包含进程的动态创建,调度和消亡,是Linux的基本调度单位. 进程控制块(PCB)是进程的静态描述,包括进程的描述信息,进程的控制信息,以及资源信息 时间片:他轮流在每个进程的得到的时间片用完后从进程那里千回控制权 1.1进程标识 os会为每一个进程分配一个唯一的盛行ID,作为进程的标识号(pid),还有父进程ID(ppid) 所有

Linux 操作系统学习笔记

一,unix 1.unix 特点 伸缩性强,开放性好, 2.基本原则 所有对象,硬件都是文件 配置数据以文本形式保存 短小的单目的程序构成 多个程序合作完成复杂任务 3.gnu 基本原则是共享,建立自由开放的unix系统 1984年 richard stallman 发起 基本体系是micro kernel 4.gpl Copyleft 原作者所有权 5.linux起源 Linustorvalds, 自由的类unix操作系统, 遵循gnu和gpl 6.linux 可以实现unix功能 遵循开源许