Linux管道编程实例
/*管道
可以把管道想象为两个实体之间的单向连接器。注意,管道是半双工的,
如果需要全双工通讯,应该转而考虑套接字。
匿名管道又称管道,提供了一个进程与它的兄弟进程通讯的方法,只存在于父进程中;
命名管道,可以存在与文件系统中,任意进程都可找到它,使得不同先祖的进程也可以通讯。
#include <unistd.h>
int pipe( int dfs[ 2 ] );创建匿名管道
int dup(int oldfd );创建一个文件描述符的副本
int dup2(int oldfd, int targetfd);
dup/dup2提供了复制文件描述符的功能。他们常用于stdin(0)、stdout(1)、stderr(2)的重定向;
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char* pathname,mode_t mode );创建一个命名管道
记住:管道只不过是一对文件描述符因此所有能够操作文件描述符的函数都可用于管道。这些函数
包括但不限于select,read,write,fcntl,freopen。
*/
/**********1、简单匿名管道应用************/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define MAX_LINE 80
#define PIPE_STDIN 0
#define PIPE_STDOUT 1
/*
myPipe[ 1 ]向管道写入数据;myPipe[ 0 ]从管道读取数据。
*/
int main( )
{
const char* string={"A simple message."};
int ret,myPipe[ 2 ];
char buffer[ MAX_LINE+1 ];
//create the pipe
ret=pipe( myPipe ); //pipe( )创建一个匿名管道
if( ret==0 )
{
//write the message into the pipe
write( myPipe[ PIPE_STDOUT ],string,strlen( string ) );
//read the message from the pipe
ret=read( myPipe[ PIPE_STDIN ],buffer,MAX_LINE );
//NULL terminate the string
buffer[ ret ]=0;
printf( "%s/n",buffer );
}
close( thePipe[ 0 ] );
close( thePipe[ 1 ] );
return 0;
}
//父子进程间利用管道通讯实例
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <wait.h>
#define MAX_LINE 80
int main( )
{
int thePipe[ 2 ],ret;
char buf[ MAX_LINE+1 ];
const char* testbuf={"a test string."};
if( pipe( thePipe )==0 )
{
if( fork( )==0 )
{
printf( "You have enter the child process/n" );
ret=read( thePipe[ 0 ],buf,MAX_LINE );
buf[ ret ]=0;
printf( "Child read info: %s/n",buf );
}
else
{
ret=write( thePipe[ 1 ],testbuf,strlen( testbuf ) );
ret=wait( NULL );
}
}
close( thePipe[ 0 ] );
close( thePipe[ 1 ] );
return 0;
}
/*值得注意的是:
把子进程的输出重定向到管道的输入,父进程的输入重定向到管道的输出。
--这是一个很值得记住的有用技术
*/
//使用C实现管道链接
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main( )
{
int pfds[ 2 ];
if( pipe( pfds )==0 )
{
if( fork( )==0 )
{
close( 1 );
dup2( pfds[ 1 ],1 );
close( pfds[ 0 ] );
execlp( "ls","ls","-l",NULL );
}
else
{
close( 0 );
dup2( pfds[ 0 ],0 );
close( pfds[ 1 ] );
execlp( "wc","wc","-l",NULL );
}
}
return 0;
}
Linux管道编程实例的更多相关文章
- linux内核模块编程实例
linux内核模块编程实例 学号:201400814125 班级:计科141 姓名:刘建伟 1.确定本机虚拟机中的Ubuntu下Linux的版本 通过使用命令uname -a/uname -r/una ...
- Linux c编程实例_例子
例一:字符与整型变量的实现 #include <stdio.h> int main() { int c1,c2; char c3; c1='a'-'A'; c2='b'-'B'; c3=; ...
- Linux多线程编程实例解析
Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...
- Linux网络编程实例解析
**************************************************************************************************** ...
- linux 定时器编程实例(完善中).....
最近在写linux 下的定时器编程实验,测试发现 usleep函数在 x86 架构下的定时还是比较准确的,在arm9下 就不太准了. 今天用linux 下的setitimer()函数进行了定时 器的测 ...
- Linux文件编程实例
//捕获fopen调用中的错误 #include <stdio.h> #include <errno.h> #include <string.h> #define ...
- Linux多进程编程实例
前言:编写多进程程序时,我们应该了解一下,创建一个子进程时,操作系统内核是怎样做的.当通过fork函数创建新的子进程时,内核将父进程的用户地址空间的内容复制给子进程,这样父子进程拥有各自独立的用户空间 ...
- Linux 多线程编程实例
一.多线程 VS 多进程 和进程相比,线程有很多优势.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护代码段和数据.而运行于一个进程中的多个线程,他们之间使用相同 ...
- linux socket编程实例
/* ============================================================================ Name : client.c Auth ...
随机推荐
- blog写作心得体会
虽然写blog也挺久了,写出来的东西自己回顾的时候也会怀疑读者是否能看的明白,还是有种流水账的感觉,以后希望多从读者的角度出发.下面记录一些以后写博客的注意点. 具体关于某种技术点的小知识还有碰到的各 ...
- Bootstrap3 表格-状态类
通过这些状态类可以为行或单元格设置颜色. .active---鼠标悬停在行或单元格上时所设置的颜色 .success--–标识成功或积极的动作 .info----标识普通的提示信息或动作 .warni ...
- linux网络编程之二-----多播(组播)编程
多播编程实例 服务器端 下面是一个多播服务器的例子.多播服务器的程序设计很简单,建立一个数据包套接字,选定多播的IP地址和端口,直接向此多播地址发送数据就可以了.多播服务器的程序设计,不需要服务器加入 ...
- jdbc批量插入
分享牛,分享牛原创.有这样一个需求,文本文件中的数据批量的插入mysql,怎么用jdbc方式批量插入呢? jdbc默认提供了批量插入的方法,可能用一次就忘记了,这里做笔记记录一下jdbc批量插入吧. ...
- Tomcat怎么实现异步Servlet
有时Servlet在生成响应报文前必须等待某些耗时的操作,比如在等待一个可用的JDBC连接或等待一个远程Web服务的响应.对于这种情况servlet规范中定义了异步处理方式,由于Servlet中等待阻 ...
- SpringMVC源码分析--文件上传
SpringMVC提供了文件上传的功能,接下来我们就简单了解一下SpringMVC文件上传的开发及大致过程. 首先需要在springMVC的配置文件中配置文件上传解析器 <bean id=&qu ...
- Excel 数据验证宏
Sub 宏1() ' ' 宏1 宏 ' ' With Selection.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlVal ...
- Android在一个TextView里显示不同样式的字体
在同一个TextView里显示不同样式的字体 public void setSpan(Object what, int start, int end, int flags); 样式1:背景色.粗体.字 ...
- Ubuntu 16.04 安装和使用QQ最简洁的方式
推荐参考网址: 1 http://www.ubuntukylin.com/ 2 http://www.ubuntukylin.com/application/ Wine QQ 1 http:// ...
- API创建员工Element
DECLARE ln_element_link_id PAY_ELEMENT_LINKS_F.ELEMENT_LINK_ID%TYPE; ld_effective_start_date DATE; l ...