管道通信之无名管道---pipe()
pipe()函数在子进程产生之前就应该存在。
- 父子进程之间只进行一次传递
/*============================================
> Copyright (C) 2014 All rights reserved.
> FileName:onepipe.c
> author:donald
> details:
==============================================*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 512
int main(int argc, const char *argv[])
{
int pipefd[];
pid_t pid; if(pipe(pipefd) == -){
perror("pipe failed");
exit(-);
}
printf("%u\n",pid);
pid == fork();//这里一个个大大的bug,自己的误操作,debug了很久才搞定了
printf("%u\n",pid);
if( == pid){
close(pipefd[]);//0 read 1 write
//一个约定,父子进程都需遵守 char buf[N];
memset(buf,,N);
read(pipefd[],buf,N);
printf("child read:%s\n",buf); printf("child exit\n");
exit();
}else{
close(pipefd[]);//0 read
char line[N];
printf("parent begin\n"); memset(line,,N);
fgets(line,N,stdin); write(pipefd[],line,strlen(line));
printf("parent exit\n");
wait(NULL);//等待子进程的结束
}
return ;
} 父子进程通过管道,进行多次读写操作,先贴上一个比较奇葩的方法(就是一个错误):
/*============================================
> Copyright (C) 2014 All rights reserved.
> FileName:my_pipe.c
> author:donald
> details:
==============================================*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1024
int main(int argc, const char *argv[])
{
int fds[];
if(pipe(fds) == -){//只能有一对进行读写
perror("failed");
exit();
}
pid_t pid = fork();
if(pid == -){
perror("error");
exit();
} while(){
if(pid == ){//child read
close(fds[]);//1 write
char buf[] = "";
read(fds[],buf,);//只能有一个读,
printf("child read:%s\n",buf);
//exit(1);
}else{//parent write close(fds[]);//0 read
// char *p = "hello,donald";
char line[N];
// memset(line,0,N);
fgets(line,N,stdin);
write(fds[],line,strlen(line));
//wait(NULL);
}
}
return ;
}再贴上正确的方法:
/*============================================
> Copyright (C) 2014 All rights reserved.
> FileName:twopipe.c
> author:donald
> details:
==============================================*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 512
int main(int argc, const char *argv[])
{
int pipefd[];
pid_t pid;
//pid = fork(); if(pipe(pipefd) == -){
perror("pipe failed");
exit(-);
}
pid = fork();
if(pid == ){
close(pipefd[]);//0 read
char buf[N];
while(){
memset(buf,,N);
if(read(pipefd[],buf,N) == ){
break;
}
printf("child read:%s\n",buf);
}
printf("child exit\n");
exit();
}else{
close(pipefd[]);
char line[N];
while(memset(line,,N),fgets(line,N,stdin) != NULL ){
write(pipefd[],line,strlen(line));
}
close(pipefd[]);
printf("parent exit\n");
wait(NULL);
}
return ;
}
管道通信之无名管道---pipe()的更多相关文章
- Linux 进程通信(无名管道)
无名管道 无名管道是半双工的,就是对于一个管道来讲,只能读,或者写. 无名管道只能在相关的,有共同祖先的进程间使用(即一般用户父子进程). 一个fork或者execve调用创建的子进程继承了父进程的文 ...
- linux进程篇 (三) 进程间的通信1 管道通信
通信方式分4大类: 管道通信:无名管道 有名管道 信号通信:发送 接收 和 处理 IPC通信:共享内存 消息队列 信号灯 socke 网络通信 用户空间 进程A <----无法通信----> ...
- Linux 进程间通信 无名管道(pipe)
无名管道: 1)只能用于具有亲缘关系的进程之间的通信(无名管道是某一个进程创建的,不像普通文件有路径,在文件系统中是不可见的,其他进程要想打开,只能通过继承的方式去打开) 2)半双工的通信模式,具有固 ...
- linux命名管道通信过程
前一个道,这节学习命名管道. 二命名管道 无名管道仅仅能用来在父子进程或兄弟进程之间进行通信,这就给没有亲缘关系的进程之间数据的交换带来了麻烦.解决问题就是本节要学习的还有一种管道通信:命名管道. 命 ...
- PHP多进程编程(2):管道通信
一个进程如果是个人英雄主义,那么多进程就是集体主义.(不严格区分多进程 和 多线程的差别) 你不再是一个独行侠,而是一个指挥家. 独来独往,非常自由自在,但是,很多时候,不如众人拾柴火焰高. 这就是我 ...
- c# c++通信--命名管道通信
进程间通信有很多种,windows上面比较简单的有管道通信(匿名管道及命名管道) 最近做个本机c#界面与c++服务进行通信的一个需求.简单用命名管道通信.msdn都直接有demo,详见下方参考. c+ ...
- linux进程的管道通信
linux进程的管道通信 要求 编程实现进程的管道通信,掌握管道通信的同步和互斥机制. 相关函数 pipe管道 指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件.向管 ...
- Linux简单程序实例(GNU工具链,进程,线程,无名管道pipe,基于fd的文件操作,信号,scoket)
一, GNU工具链简介: (1)编译代码步骤: 预处理 -> 编译 -> 汇编 -> 链接: 预处理:去掉注释,进行宏替换,头文件包含等工作: gcc -E test.c -o te ...
- 进程间通信IPC之--无名管道(pipe)和有名管道(fifo)(转)
进程间通信IPC之--无名管道(pipe)和有名管道(fifo) 2012-01-17 22:41:20 分类: C/C++ 每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中 ...
随机推荐
- tokyocabinet安装日志(持续更新)
http://sourceforge.jp/projects/sfnet_tokyocabinet/releases/这个网站的最新tt和tc都在此1.下载tokyocabinethttp://sou ...
- Avoid The Lakes--poj3620
Avoid The Lakes Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7023 Accepted: 3735 D ...
- JS 禁止浏览器右键菜单和刷新
<script language="javascript"> //禁止按键F5 document.onkeydown = function(e){ e = window ...
- PHP数组排序函数array_multisort()函数详解
这个函数因为用到了,并且在网上找了半天终于找到了一个写的通俗易懂的文章,在这里分享给大家. 原文链接:http://blog.163.com/lgh_2002/blog/static/44017526 ...
- QT Creator 2.7.2 代码自动补全快捷键设置
在QT Creater界面点[工具]再进[选项]找到[环境]下的[键盘]选项,搜索[CompleteThis]发现默认快捷键就是CTRL+SPACE,把它删除,然后添加自己想设置的快捷键(因为之前用e ...
- Silverlight中的拖拽实现的图片上传
原文 http://blog.csdn.net/dujingjing1230/article/details/5443003 在Silverlight中因为可以直接从系统的文件夹里面拖出来一个文件直接 ...
- linux之SQL语句简明教程---Alias
接下来,我们讨论 alias (别名) 在 SQL 上的用处.最常用到的别名有两种: 栏位别名及表格别名. 简单地来说,栏位别名的目的是为了让 SQL 产生的结果易读.在之前的例子中,每当我们有营业额 ...
- 学习本课程需要具备哪些基础及微信小程序目录结构介绍
1.html css js 基础 2.ajax 基础 3.简单的面向对象基础
- 格而知之2:UIView的autoresizingMask属性探究
UIView的autoresizingMask属性,是用在当一个UIView实例的父控件的尺寸发生变化时,来自动调整UIView实例在父控件中的位置与尺寸的.autoresizingMask属性是一个 ...
- InterLockedIncrement and InterLockedDecrement函数原理
实现数的原子性加减. 什么是原子性的加减呢? 举个样例:假设一个变量 Long value =0; 首先说一下正常情况下的加减操作:value+=1. 1:系统从Value的空间取出值,并动态生成一个 ...