linux管道学习(一)
最近学习了管道 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管道学习(一)的更多相关文章
- linux管道学习(二)
int main() { char* pipename = "pipe"; mkfifo(pipename,); int pid = fork(); ) { printf(&quo ...
- Linux IPC(Inter-Process Communication,进程间通信)之管道学习
1.标准流管道 管道操作支持文件流模式,用来创建链接还有一个进程的管道,通过函数popen和pclose popen的详细介绍在本blog:Linux 多进程学习中有具体介绍 2.无名管道(PIPE) ...
- 别出心裁的Linux命令学习法
别出心裁的Linux命令学习法 操作系统操作系统为你完成所有"硬件相关.应用无关"的工作,以给你方便.效率.安全.操作系统的功能我总结为两点:管家婆和服务生: 管家婆:通过进程.虚 ...
- Linux 第一次学习笔记
一.Linux 为何物 Linux 就是一个操作系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS ,至于操作系统是什么,就不用过多解释了,如果你学习过前面的入门课程,应该会有 ...
- Linux系统学习笔记:文件I/O
Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...
- 虚拟机的安装以及Linux的学习
安装虚拟机 对虚拟机的认识 其实初中的时候我就听说过虚拟机这个名词,当时的我还小,也不知道虚拟机是个什么东西,那时我傻傻的认为虚拟机只不过是电脑中的一个虚拟的计算机,没有什么实在的作用.后来随着大学课 ...
- 安装虚拟机&Linux命令学习
安装虚拟机&Linux命令学习 基于VirtualBox虚拟机安装Ubuntu 1.下载安装VirtualBox 根据自己电脑(32位操作系统)的实际情况,我在网上找了相应的VirtualBo ...
- Linux入门学习笔记2:终端命令
LINUX操作系统学习 命令 附带建 cd .. 当前路径的上一层 ../.. 当前路径的上两层 . 当前路径 - 跳转到上一次所在路径 ...
- Linux 基础学习2
目录 Linux 基础学习2 文件目录结构 文件命名规范 文件系统结构 linux应用程序的组成 绝对路径和相对路径 目录名和基名 切换目录 切换到家目录 切换到上一次的目录 显示当前的工作目录 列出 ...
随机推荐
- linux统计文件夹某一些文件的大小总和
du -m smallgame_2006* | awk '{sum += $1}; END{print sum}' -m代表单位是MB, awk命令需要'',且命令需换行
- csipsimple 下载地址
项目下载地址: http://git.oschina.net/zencodex/CSipSimple https://github.com/zencodex/csip
- 2015 CCPC D- Pick The Sticks(UESTC 1218) (01背包变形)
http://acm.uestc.edu.cn/#/problem/show/1218 既然二维dp表示不了,就加一维表示是否在边界放置,放置一个,两个.有一个trick就是如果只放一根,那么多长都可 ...
- oracle中exp,imp的使用详解
http://www.cnblogs.com/yugen/archive/2010/07/25/1784763.html
- 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起
话说,平凡之处显真格,这一点也没错! 比如,对旋转图像进行双线性插值,很简单吧? 可,对我,折腾了大半天,也没有达到预期效果! 尤其是三个误区让我抓瞎好久: 1,坐标旋转公式. 这东西,要用 ...
- 在C#中我们能调用一个类的私有方法吗
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.
- linux jmail乱码
在Windows 里面,标题和内容都正常, 在linux里面,--- 1.字符串 more /etc/sysconfig/i18n export LANG=en_US.UTF-8 ====默认是e ...
- [Android]Fragment源代码分析(二) 状态
我们上一讲,抛出来一个问题,就是当Activity的onCreateView的时候,是怎样构造Fragment中的View參数.要回答这个问题我们先要了解Fragment的状态,这是Fragment管 ...
- Web挖掘技术
一.数据挖掘 数据挖掘是运用计算机及信息技术,从大量的.不全然的数据集中获取隐含在当中的实用知识的高级过程.Web 数据挖掘是从数据挖掘发展而来,是数据挖掘技术在Web 技术中的应用.Web 数据 ...
- careercup-树与图 4.5
4.5 实现一个函数,检查一棵二叉树是否为二叉查找树. 参考:http://blog.csdn.net/sgbfblog/article/details/7771096 C++实现代码: #inclu ...