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环境高级编程> ...
随机推荐
- Python 计算程序运行时间
import time def start_sleep(): time.sleep(3) if __name__ == '__main__': #The start time st ...
- javaEE的十三个技术规范
java 是一种非常棒的语言,健壮,跨平台运行,屏蔽了具体的平台环境的要求,也就是说只要支持java 虚拟机,就可以运行java程序. 下面,我们一起学习一下J2EE的十三种技术规范. 一.JDBC: ...
- wpf 父控件透明子控件不透明
在wpf开发中遇到子控件会继承父类控件属性的问题, 例如: <StackPanel Orientation="Horizontal" Grid.Row="1&quo ...
- 关于Merge的整理--AndroidScreenSlidePager开源库中用到的
在做AndroidScreenSlidePager开源库练习demo的时候,发现布局文件使用的是<merge>标签而不是<FrameLayout>标签.作者给出的说法是:Cir ...
- js获取网页高度(详细整理)
网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document.body.offset ...
- c++、c实现推箱子小游戏
经过四次的修改和优化,终于将推箱子这个游戏完整的写出来了,今天就像大家分享一下这个游戏的编写. 这个游戏界面的编写总的来说不困难,主要是推动箱子的算法. (1)利用数组和windows api 即可写 ...
- Git CMD - status: Show the working tree status
命令参数 git status [<options>…] [--] [<pathspec>…] 命令格式 --short, -s 短格式输出. -- long 长格式输出, ...
- StringBuilder和StringBuffer
StringBuilder java.lang 类 StringBuilder java.lang.Object java.lang.StringBuilder 所有已实现的接口: Serializa ...
- 【原】GO 语言常见错误
1. Scan error on column index 4: converting string "" to a int: strconv.ParseInt: parsing ...
- 在使用masm32 rc编译资源文件.rc出现的问题
fatal error RC1004: unexpected end of file found 很蛋疼.然来是.h宏定义文件中.最后一行加个回车键即可.否则就提示这错误.