执行ls | wc -l

时间:2014-02-04 14:28:44

标签: exec

以下代码实现:

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?这条线试图实现什么?

1 个答案:

答案 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]的值更改程序行为。传统上,viex文件名与同一数据硬链接。如果在vi执行,该程序是一个全屏编辑器。执行为ex,它改变了行为并作为行编辑器运行。许多其他可执行文件的工作方式相同。

这是Unix常规入口点与硬链接和软链接之间协同作用的一个例子。