Linux管道通信多次读写,linux进程通信之(二):管道的读与写
为了更好的理解管道的读与写,请看下面的一段程序:
#include#include#include#include#include
int main()
{
int pipe_fd[2];
pid_t pid;
char buf_r[100];
char *p_wbuf;
int r_num;
memset(buf_r,0,sizeof(buf_r));//把一段内存清0
if(pipe(pipe_fd)<0)//创建管道
{
printf("pipe create error\n");
return -1;
}
if((pid=fork())==0)//创建一子进程,如果子进程先运行
{
printf("\n");
close(pipe_fd[1]);//关闭子进程写描述符,并通过使父进程暂停2s确保
//父进程已关闭相应的读描述符
sleep(2);
if((r_num=read(pipe_fd[0],buf_r,100))>0)//子进程读取管道内容
{
printf("%d numbers read from the pipe is %s\n",r_num,buf_r);
}
close(pipe_fd[0]);//关闭子进程读描述符
exit(0);
}
else if(pid>0)//如果父进程先运行
{
close(pipe_fd[0]);//关闭父进程读描述符,并分两次向管道中写入hello pipe
if(write(pipe_fd[1],"hello",5)!=-1)
{
printf("parent write1 success !\n");
}
if(write(pipe_fd[1],"pipe",5)!=-1)
{
printf("parent write2 sucess !\n");
}
close(pipe_fd[1]);//关闭父进程写描述符
sleep(3);
waitpid(pid,NULL,0);//收集子进程退出信息
exit(0);
}
}
/*--------------------------------------------------------
notes:
1.用pipe函数创建的管道两端处于一个进程中,实际上,通常先是创建一个管道,再
通过fork()函数创建一子进程,该子进程会继承父进程所创建的管道。
2.实验:
[root@localhost the_eight_step]# gcc pipe_rw.c -o pipe_rw
[root@localhost the_eight_step]# ./pipe_rw
parent write1 success !
parent write2 sucess !
10 numbers read from the pipe is hellopipe
3.管道读写注意点
.只有在管道的读写端存在时向管道中写入数据才有意义。否则,向管道中写入数据的进程
将收到内核传来的SIFPIPE信号(通常Broken pipe错误)。
.向管道中写入数据时,linux将不保证写入的原子性,管道缓冲区有一空闲区域,写进程就
会试图向管道写入数据。如果读进程不读取管道缓冲区中的数据,那么写操作将会一直阻塞。
.父子进程在运行时,它们的先后次序并不能保证,因此,在这里为了保证父进程已经关闭了
读描述符,可在子进程中调用sleep函数。
4.主要顺序:
先创建管道,后创建子进程
-------------------------------------------------------------*/
Linux管道通信多次读写,linux进程通信之(二):管道的读与写相关推荐
- Linux——(管道练习)C实现父子进程通信、兄弟进程通信、多个读写端操作管道及管道缓冲区大小、fifo实现非血缘间进程通信
一. 父子进程通信 lswc-l 父进程ls写到管道,子进程wc管道的内容 父进程创建管道(拥有读写两端),父进程fork子进程,父进程要将原本输出到屏幕上的内容输出到管道中,用dup实现,然后exe ...
- pe读linux硬盘分区工具_已经成功把pe安装到linux分区,并能读写linux分区
优点:Windows中一般是不能读写linux分区的,除非用了相应的工具.因此把pe安装到linux分区是比较安全的,而且pe可以读写linux分区,这样你的系统也可以备份到linux分区了. 步骤: ...
- linux c之通过消息队列实现进程通信
1.消息队列的介绍 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的 ...
- linux 磁盘数据空 还有读写,Linux入门之磁盘管理(5)dd命令使用
Linux入门之磁盘管理(5)dd命令使用 在Linux中,经常需要一些数据读写等测试,还有文件以及其它数据的备份迁移,一般使用cp命令可以解决一部分,但是其无法进行控制数据的流向及动作,这时就可以使 ...
- linux进程管道通信缺点,Linux进程通信(IPC)的方式详解
前言:Linux进程通信的方式 什么是进程通信?进程通信是指进程之间交换信息 进程通信方式共有6种: 管道(pipe),包括流管道(s_pipe)和有名管道(named pipe) 信号(signal ...
- linux通信管道破裂,Linux下进程通信之管道
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把 ...
- Linux进程通信(一)——pipe管道
本章内容 采用pipe管道如何进行进程之间的通信 pipe管道进程通信的规则和限制 Linux中pipe管道的实现机制和管理pipe管道的结构体 什么是进程通信 进程通信就是两个进程之间进行数据交换, ...
- 操作系统实验·Linux进程通信与内存管理
预备知识 Linux进程的数据结构 在Linux中,进程用task_struct表示,所有进程被组织到以init_task为表头的双向链表中(见[include/linux/sched.h]SET_L ...
- linux命名管道进程间通信,Linux进程间通讯--命名管道
IPC安全 前面总结了匿名管道,如今来看命名管道:因为匿名管道的一个限制就是:只能是有血缘关系的进程间才能够通讯,好比:有两个同祖先的子进程,父子进程等:为了突破这一个限制,想让没有任何关系的两个进程 ...
- Linux 进程通信fifo,Linux 进程通信之FIFO的实现
FIFO通信(first in first out) FIFO 有名管道,实现无血缘关系进程通信. 创建一个管道的伪文件 a.mkfifo testfifo 命令创建 b.也可以使用函数int mkf ...
最新文章
- UML建模之活动图介绍
- python编程书籍1020python编程书籍_代写INFT 1020作业、Database作业代做、Java课程作业代写、c++,Python编程作业代做...
- 07/11/20 资料整理
- Microsoft SQL Server Version List 版本列表
- mysql行锁同索引键问题_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)
- Python中正反斜杠('/'和'\')的意义
- php 周末 培训,济南php周末培训班
- jsonArray:JavaBean,List,Map转成json格式(轉+整理)
- Producter:让产品从0到1
- 13种常见软件体系结构风格定义分析、结构图、优缺点
- 什么是操作系统啊 | 战术后仰
- Win10插入U盘无反应,但是U盘是正常的解决方法
- mysql中大文本的数据类型
- Win10系统下基于Docker构建Appium容器连接Android模拟器Genymotion完成移动端Python自动化测试
- Ubuntu下解决firefox profile cannot be loaded it may be missing or inaccessible
- 十三香是什么,怎么用?
- 医用IT隔离电源在医院特殊场所接地系统的应用
- jzoj P1285 奶酪厂
- MySQL:Got error 139 from storage engine
- 部门新来的00后测试员已把我卷崩溃,老油条表示真干不过,但是...