以下代码实现:
ls | wc -l
码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pfds[2];
pipe(pfds);
if (!fork()) {
close(1); /* close normal stdout */
dup(pfds[1]); /* make stdout same as pfds[1] */
close(pfds[0]); /* we don't need this */
execlp("ls", "ls", NULL);
} else {
close(0); /* close normal stdin */
dup(pfds[0]); /* make stdin same as pfds[0] */
close(pfds[1]); /* we don't need this */
execlp("wc", "wc", "-l", NULL);
}
return 0;
}
在execlp("ls", "ls", NULL);
为什么我们用ls替换ls?这条线试图实现什么?
答案 0 :(得分:2)
我的Arch linux盒子上execlp()
的原型:
int execlp(const char *file, const char *arg, ...);
你不是“用'ls'代替'ls'”。 “ls”的第一个实例是exec的文件,显然是在当前工作目录中。根据exec手册页,“ls”的第二个实例将成为argv[0]
的值。
你会记得Unix和Linux下的C程序有一个传统的入口点int main(int argc, char *argv[])
。 argv
是一个指针数组,第一个点(索引0)将指向一个字符串“ls”。
这个值来自于能够根据argv[0]
的值更改程序行为。传统上,vi
和ex
文件名与同一数据硬链接。如果在vi
执行,该程序是一个全屏编辑器。执行为ex
,它改变了行为并作为行编辑器运行。许多其他可执行文件的工作方式相同。
这是Unix常规入口点与硬链接和软链接之间协同作用的一个例子。