简单的结合pipe实现ls -l | wc -l
无名管道是用于有亲属关系的进程通信。
dup2函数:系统调用dup和dup2能够复制文件描述符。dup2是可以指定而已。
n_fd = dup2(fd3, STDOUT_FILENO)表示n_fd与fd3共享一个文件表项(它们的文件表指针指向同一个文件表项),n_fd在文件描述符表中的位置为 STDOUT_FILENO的位置,而原先的STDOUT_FILENO所指向的文件表项被关闭。
(1) “dup2的第一个参数是不是必须为已打开的合法filedes?” – 答案:必须。
(2) “dup2的第二个参数可以是任意合法范围的filedes值么?” – 答案:可以,在Unix其取值区间为[0,255]。
#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;
}
}