Linux进程间通信IPC学习笔记之管道
基础知识:
管道是最初的Unix IPC形式,可追溯到1973年的Unix第3版。使用其应注意两点:
1)没有名字;
2)用于共同祖先间的进程通信;
3)读写操作用read和write函数
#include <unistd.h>
int pipe(int fildes[2]);
返回:成功返回1,否则返回-1.创建成功的两个文件描述符:f[0]和f[1],前者用来打开读,后者用来打开写。#include <unistd.h>
ssize_t read(int fildes, void *buf, size_t nbyte);
ssize_t write(int fildes, const void *buf, size_t nbyte);
测试代码:
代码1
#include<stdio.h>
#include<unistd.h> int main()
{
int n,fd[]; // 这里的fd是文件描述符的数组,用于创建管道做准备的
pid_t pid;
char line[];
if(pipe(fd)<) // 创建管道
printf("pipe create error/n"); if((pid=fork())<) //利用fork()创建新进程
printf("fork error/n");
else if(pid>)
{ //这里是父进程,先关闭管道的读出端,然后在管道的写端写入“hello world"
close(fd[]);
write(fd[],"hello word/n",);
}
else
{ //这里是子进程,先关闭管道的写入端,然后在管道的读出端读出数据
close(fd[]);
n= read(fd[],line,);
write(STDOUT_FILENO,line,n);
}
exit();
}
代码2
#include <unistd.h>
#include <stdio.h> void client (int, int ) , server (int , int) ;
int main(int argc, char **argv)
{
int pipe1[] ,pipe2[];
pid_t childpid; pipe(pipe1);/* create two pipes */
pipe(pipe2); if ( (childpid = fork () ) == )
{ /* child */
close (pipe1[]) ;
close (pipe2[]) ;
server (pipe1[],pipe2[]) ;
exit () ;
}
/* parent */
close (pipe1[]) ;
close (pipe2[]) ;
client (pipe2[], pipe1[]) ; waitpid(childpid, NULL, ); /* wait for child to terminate */
exit() ; } void client(int readfd, int writefd)
{
size_t len;
ssize_t n;
char buff[MAXLINEI; /* read pathname */
fgets (buff, MAXLINE, stdin) ;
len = strlen(buf f) ; /* £gets() guarantees null byte at end */
if (buff [len - ] == '\n' )
len--; /* delete newline from £gets() */ /* write pathname to IPC channel */
write(writefd, buff, len); /* read from IPC, write to standard output */
while ( (n = Read(readfd, buff, MAXLINE)) > )
write(STD0UT_FILENO, buff, n):
}
void server(int readfd, int writefd)
{
int fd;
ssize_t n;
char buff [MAXLINE + ]; /* read pathname from IPC channel */
if ( (n = Read(readfd, buff, MAXLINE) ) == )
err-quit("end-of-file while reading pathname"):
buff[n] = '\0'; /* null terminate pathname */ if ( (fd = open(buff, O_RDONLY)) < )
{
/* error: must tell client */
snprintf(buff + n, sizeof(buff) - n, ": can't open, %s\",strerror(errn0));
n = strlen(buf f) ;
write(writefd, buff, n) ;
}
else
{
/* open succeeded: copy file to IPC channel */
while ( (n = Read(fd, buff, MAXLINE)) > )
write(writefd, buff, n);
close ( fd) ;
} }

参考资料
Linux进程间通信IPC学习笔记之管道的更多相关文章
- Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)
Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)
- Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
- Linux进程间通信IPC学习笔记之消息队列(SVR4)
Linux进程间通信IPC学习笔记之消息队列(SVR4)
- Linux进程间通信IPC学习笔记之有名管道
基础知识: 有名管道,FIFO先进先出,它是一个单向(半双工)的数据流,不同于管道的是:是最初的Unix IPC形式,可追溯到1973年的Unix第3版.使用其应注意两点: 1)有一个与路径名关联的名 ...
- Linux进程间通信IPC学习笔记
linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的.而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...
- Linux进程间通信IPC学习笔记之同步一(线程、互斥锁和条件变量)
基础知识: 测试代码: 参考资料: Posix 多线程程序设计
- Linux进程间通信IPC学习笔记之消息队列(Posix)
基础知识: 消息队列可认为是一个消息链表,有足够写权限的线程可往队列中放置消息,有足够读权限的线程可以从队列中取走消息.在某个进程往一人队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达. ...
- linux的IPC进程通信方式-匿名管道(一)
linux的IPC进程通信-匿名管道 什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号"|"来使用管道,但是管道的真正定义是 ...
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存 参考:<linux编程从入门到精通>,<Linux C程序设计大全>,<unix环境高级编程> ...
随机推荐
- 奥运会订票系统c语言代写源码下载
制作能够实现2008北京奥运会网上订票的系统,能够实现购票人员注册.购票.管理人员可以设置各个比赛场地的赛事安排及票数. 程序要求实现的功能如下: 购票者信息注册:购票者可以用昵称和身份证进行注册,若 ...
- linux-redhat5找回root密码
我在虚拟机里装了个redhat(RedhatEnterpriseLinuxASv5.4-x64),也不经常用,偶尔进去用用吧,又把密码忘记了,哎...脑子不好使啊 不知道像ubuntu是不是一样的,还 ...
- [改善Java代码]Java的泛型是类型擦除的
泛型可以减少强制类型的转换,可规范集合的元素类型,还可以提高代码的安全性和可读性,正是因为有了这些优点,自从Java引入泛型之后,项目的编码规则上便多了一条,优先使用泛型. Java泛型(Generi ...
- [未完成][Mooc]关于Linxu的总结(一)
视频1:Linux之前有个Minix(这个是一个教授用来教学用的)开源的,不是编译过的,不能通过QQ.exe找到其源码.后来Linus这个家伙搞了一个Linux.服务器领域超过百分之八十.linux是 ...
- 24小时学通Linux内核--内核探索工具类
寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间里还是希望能够补充一下Linux内核相关知识,接下来继续 ...
- RTC之初始化
RTC为了避免初始化一般有3中方法: 一给MCU的VBAT供电,利用MCU的后备寄存器保存已经设置过时间的标志值,RTC初始化时先查询寄存器值如果是已经设置过则不用初始化设置时间 二 当不给VBUAT ...
- less-3-混合
混合特性类似于编程语言中的继承.设计好一个样式类,然后再其他样式中直接混合这个样式类,实现样式的继承重用.就像函数一样调用,并且可以传递参数,功能非常强大,实用. less代码: 生成的css代码: ...
- Ehcache(2.9.x) - API Developer Guide, Blocking and Self Populating Caches
About Blocking and Self-Populating Caches The net.sf.ehcache.constructs package contains some applie ...
- 【转载】Spark SQL 1.3.0 DataFrame介绍、使用
http://www.aboutyun.com/forum.php?mod=viewthread&tid=12358&page=1 1.DataFrame是什么?2.如何创建DataF ...
- React-Native错误笔记-EPERM
运行react-native run-android时出现错误 EPERM:operation not permitted,lstat .............. 解决办法:用Android Stu ...