Linux下的管道编程技术(4)

发表于:2013-03-06来源:开源黄页作者:天狼星点击数: 标签:linux
14: if ( pipe( thePipe ) == 0 ) ...{ 15: 16: if (fork() == 0) ...{ 17: 18: ret = read( thePipe[0], buf, MAX_LINE ); 19: buf[ret] = 0; 20: printf( Child read %s\n, buf ); 21: 22: } else ...{ 23: 24: re
14: if ( pipe( thePipe ) == 0 ) ...{
15:
16: if (fork() == 0) ...{
17:
18: ret = read( thePipe[0], buf, MAX_LINE );
19: buf[ret] = 0;
20: printf( "Child read %s\n", buf );
21:
22: } else ...{
23:
24: ret = write( thePipe[1], testbuf, strlen(testbuf) );
25: ret = wait( NULL );
26:
27: }
28:
29: }
30:
31: return 0;
32: }

  需要注意的是,在这个示例程序中我们没有说明如何关闭管道,因为一旦进程结束,与管道有关的资源将被自动释放。尽管如此,为了养成一种良好的编程习惯,最好利用close调用来关闭管道的描述符,如下所示:

ret = pipe( myPipe );
...
close( myPipe[0] );
close( myPipe[1] );

  如果管道的写入端关闭,但是还有进程尝试从管道读取的话,将被返回0,用来指出管道已不可用,并且应当关闭它。如果管道的读出端关闭,但是还有进程尝试向管道写入的话,试图写入的进程将收到一个SIGPIPE信号,至于信号的具体处理则要视其信号处理程序而定了。

  2.2 dup函数和dup2函数

  dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数的原型如下所示:

#include
int dup( int oldfd );

原文转自:http://yp.oss.org.cn/blog/show_resource.php?resource_id=598