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

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

struct node{
int a;
long b;
}; int main()
{
int field[];
pid_t pid;
char buf[];
int returned_count; pipe(field);
//fcntl(field[0], F_SETFL, O_NONBLOCK);
int status;
pid = fork();
if(pid < )
{
printf("Error In Fork\n");
exit();
}
if(pid == )
{
printf("In Child Process\n");
close(field[]);
node testnode;
testnode.a = ;
testnode.b = ;
//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[],&testnode,sizeof(testnode));
testnode.a = ;
testnode.b = ;
write(field[],&testnode,sizeof(testnode));
exit();
}
else
{
printf("In Parent Process\n");
close(field[]);
//read(field[0],buf,sizeof(buf));
node ptestnode;
read(field[],&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[],&ptestnode,sizeof(node));
printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b);
//waitpid(pid,&status,0);
} close(field[]);
}

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

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

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

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

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

例如

 node ptestnode;
int bufcount = ;
bufcount = read(field[],&ptestnode,sizeof(node));
//printf("Msg %s from Child\n",buf);
printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b); while(bufcount)
{
bufcount = read(field[],&ptestnode,sizeof(node));
if(!bufcount)
{
break;
}
printf("Msg From Child node a= %d, b= %ld\n",ptestnode.a,ptestnode.b);
} 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. jquery实现无外边框table

    jquery实现无外边框table 在需要设为无外边框的table上加上class noOutBorder <tableclass="noOutBorder"> < ...

  2. Windows下使用GCC编译器

    1.GCC编译器的选择 Windows下最常见的安装GCC的方式有两种:Cygwin和MinGW.本文主要介绍MinGW的安装配置. 2.下载MinGW 下载地址:http://sourceforge ...

  3. HDU-3622 Bomb Game 2sat

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3622 题意:一个平面上有很多的炸弹,每个炸弹的爆炸范围是一样的,求最大的爆炸范围使得炸弹之间不相互影响 ...

  4. [转]2-SAT问题及其算法

    转自:http://www.cppblog.com/MatoNo1/archive/2011/07/13/150766.html [2-SAT问题]现有一个由N个布尔值组成的序列A,给出一些限制关系, ...

  5. html页面一段时间自动跳转

    一.JS    <script> var flag = true; document.onmousemove = new Function("flag = false;" ...

  6. 【03】尽可能使用const

    1.为什么搞出const关键字? const指定一个语义约束,指定一个对象不可修改.如果一个对象不可修改,就应该说出来. 2.const与指针 const可以修饰指向之物,也可以修改指针本身.STL中 ...

  7. Kinect开发学习笔记之(一)Kinect介绍和应用

    Kinect开发学习笔记之(一)Kinect介绍和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...

  8. [React] React Fundamentals: First Component

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. UPDATE sql 优化

    一个网友说他的存储过程中有一段update sql,运行了15分钟还没出结果,需要优化一下 他把sql发给我 UPDATE TB_RESULT R SET R.VOTE_COUNT=NVL(( SEL ...

  10. Java基础知识强化之集合框架笔记72:集合特点和数据结构总结

    1. 集合 (1)Collection(单列集合) List(有序,可重复):                         ArrayList:底层数据结构是数组,查询块,增删慢.线程不安全,效率 ...