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

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

  1. struct node{
  2. int a;
  3. long b;
  4. };
  5.  
  6. int main()
  7. {
  8. int field[];
  9. pid_t pid;
  10. char buf[];
  11. int returned_count;
  12.  
  13. pipe(field);
  14. //fcntl(field[0], F_SETFL, O_NONBLOCK);
  15. int status;
  16. pid = fork();
  17. if(pid < )
  18. {
  19. printf("Error In Fork\n");
  20. exit();
  21. }
  22. if(pid == )
  23. {
  24. printf("In Child Process\n");
  25. close(field[]);
  26. node testnode;
  27. testnode.a = ;
  28. testnode.b = ;
  29. //sleep(10);
  30. //write(field[1],"This is a pipe test\n",strlen("This is a pipe test"));
  31. //write(field[1],"This is another pipe test\n",strlen("This is another pipe test"));
  32. write(field[],&testnode,sizeof(testnode));
  33. testnode.a = ;
  34. testnode.b = ;
  35. write(field[],&testnode,sizeof(testnode));
  36. exit();
  37. }
  38. else
  39. {
  40. printf("In Parent Process\n");
  41. close(field[]);
  42. //read(field[0],buf,sizeof(buf));
  43. node ptestnode;
  44. read(field[],&ptestnode,sizeof(node));
  45. //printf("Msg %s from Child\n",buf);
  46. printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b);
  47.  
  48. read(field[],&ptestnode,sizeof(node));
  49. printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b);
  50. //waitpid(pid,&status,0);
  51. }
  52.  
  53. close(field[]);
  54. }

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

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

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

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

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

例如

  1. node ptestnode;
  2. int bufcount = ;
  3. bufcount = read(field[],&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[],&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");

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

  1. linux管道学习(二)

    int main() { char* pipename = "pipe"; mkfifo(pipename,); int pid = fork(); ) { printf(&quo ...

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

    1.标准流管道 管道操作支持文件流模式,用来创建链接还有一个进程的管道,通过函数popen和pclose popen的详细介绍在本blog:Linux 多进程学习中有具体介绍 2.无名管道(PIPE) ...

  3. 别出心裁的Linux命令学习法

    别出心裁的Linux命令学习法 操作系统操作系统为你完成所有"硬件相关.应用无关"的工作,以给你方便.效率.安全.操作系统的功能我总结为两点:管家婆和服务生: 管家婆:通过进程.虚 ...

  4. Linux 第一次学习笔记

    一.Linux 为何物 Linux 就是一个操作系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS ,至于操作系统是什么,就不用过多解释了,如果你学习过前面的入门课程,应该会有 ...

  5. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

  6. 虚拟机的安装以及Linux的学习

    安装虚拟机 对虚拟机的认识 其实初中的时候我就听说过虚拟机这个名词,当时的我还小,也不知道虚拟机是个什么东西,那时我傻傻的认为虚拟机只不过是电脑中的一个虚拟的计算机,没有什么实在的作用.后来随着大学课 ...

  7. 安装虚拟机&Linux命令学习

    安装虚拟机&Linux命令学习 基于VirtualBox虚拟机安装Ubuntu 1.下载安装VirtualBox 根据自己电脑(32位操作系统)的实际情况,我在网上找了相应的VirtualBo ...

  8. Linux入门学习笔记2:终端命令

    LINUX操作系统学习 命令   附带建     cd   .. 当前路径的上一层       ../.. 当前路径的上两层       . 当前路径       - 跳转到上一次所在路径       ...

  9. Linux 基础学习2

    目录 Linux 基础学习2 文件目录结构 文件命名规范 文件系统结构 linux应用程序的组成 绝对路径和相对路径 目录名和基名 切换目录 切换到家目录 切换到上一次的目录 显示当前的工作目录 列出 ...

随机推荐

  1. 小波变换和motion信号处理(二)(转)

    写的太好,这是第二篇:http://www.kunli.info/2011/02/18/fourier-wavelet-motion-signal-2/ 这是<小波变换和motion信号处理&g ...

  2. Kooboo中主要的几个关键词中的关系

    Kooboo中主要的几个关键词中的关系 Content Type  //相当于数据库表 Content      //相当于数据 View         //部分View 她可以使用Content ...

  3. wave文件(*.wav)格式、PCM数据格式, goldwave 可以播放pcm raw audio

    1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 44100 次采 ...

  4. jquery判断文本域长度

    <div id="result">您还可以输入100字</div> <textarea name="content" id=&qu ...

  5. UIImage的使用

    UIImage是IOS中层级比较高的一个用来加载和绘制图像的一个类,更底层的类还有CGImage,以及IOS5.0以后新增加的CIImage.今天我们主要聊一聊UIImage的三个属性: imageO ...

  6. NPIV介绍

    我们知道在存储区域网络(SAN:storage area network),主机(Host)能够访问后端存储(比如CLARiiON,VNX)必备的一个前提是主机必须配备HBA卡(Host Bus Ad ...

  7. MySQL——索引与优化

    http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调 ...

  8. SignalR安装以及安装问题

    正常节奏 介绍 SignalR 是 ASP.NET 团队正在开发的一个 Microsoft .NET Framework 库和 jQuery 插件,可能包括在以后版本的 ASP.NET 平台中. 它提 ...

  9. android模拟器经常出现的一些问题及解决办法

    1.Unable to get view server version from device exlipse下编写好android应用程序时候,右键项目 run as android applica ...

  10. 动作-CCActionInterval之CCAnimation&CCAnimate

    动画简单实例 v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#def ...