最近学习了管道 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. virtualenv下配置nginx uwsgi Django

    1.安装virtualenv,创建虚拟环境django15 sudo apt-get install virtualenv virtualenv env source bin/active pip i ...

  2. css3随笔

    1 rgba和opacity的区别 RGBA即红色R+绿色G+蓝色B+通道Alpha 语法: R:红色值.正整数 | 百分数 G:绿色值.正整数 | 百分数 B:蓝色值.正整数| 百分数 A:透明度. ...

  3. 学习Visitor Pattern 有感而发!override and overload

    通过阅读各位前辈写的博文,像吕震宇,idior,李建忠WebCast等,对Visitor模式有一定的了解,有感而记录下来,以备忘. Visitor Pattern 假设了这样一个场景,在一个类型层次中 ...

  4. js 复制网页内容,兼容各浏览器

    因需要做一个js单击,复制当前网页url的功能.使用的是如下的方法,但是只能在ie浏览器下正常使用. 方法如下: function copyURL(){ var clipBoardContent=&q ...

  5. bootstrap-table对前台页面表格的支持

    1.bootstrap-table是在bootstrap的基础上面做了一些封装,所以在使用bootstrap-table之前要导入的js和css有 1)基本的还是jQuery <script t ...

  6. 织梦/dedecms 当文章转载时不需要设置图片水印的设置,取消’图片是否加水印‘的复选框,并且修改如下文件即可生效

    当想添加水印是选中“图片是否加水印”复选框即可. 找到include/helpers/image.helper.php这个文件,在里面找到中的if( isset($GLOBALS['needwater ...

  7. Spring Batch Framework– introduction chapter(下)

    Extract,Transform, and load(ETL) Briefly stated, ETL is a process in the database anddata-warehousin ...

  8. IIS7及以上伪静态报错404

    内容摘要:故障现象:DTCMS开启伪静态功能,VS2010预览正常,发布到IIS后报错404.0错误(WIN7,WIN8,SERVER2008).模块IISWebCore通知MapRequestHan ...

  9. Eclipse的LogCat总是自动清空怎么办?

    我们经常会遇到这样一种情况,由于Log太多,导致我们的LogCat总是被自动清空,该怎么办?错误信息看不到,How to do? 其实,我们通过adb shell来解决这个问题. 1.配置环境变量 环 ...

  10. android 开发过程中碰到的 Failed to create the part's controls 问题

    在开发android的过程中,遇到一个很奇怪的问题,出现了“ Failed to create the part's controls” 的错误,查询了N多资料,然后逐条删除代码测试, 后来发现是变量 ...