【问题标题】:C: Trying to implement unnamed pipesC:尝试实现未命名的管道
【发布时间】:2015-05-25 19:57:37
【问题描述】:

我正在尝试制作一个模拟终端无名管道的程序。例如,如果我想运行命令:

ls -l | grep ‘10’

应该是:

./pipes ls -l - grep '10'

(我使用 - 而不是 |)。

但是,我的程序无法运行,因为 execvp 失败(地址错误)。这对我来说似乎是不可能的。我究竟做错了什么?欢迎任何帮助!

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <assert.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

 void np_exec(char* cmd, char** argv)
 {
    int fd[2];

    while(*(++argv) != NULL)
    {
            pipe(fd);

            int pid = fork(); //parent executes
            if(pid < 0)
            {
                    printf("Error forking");
                    exit(1);
            }

            if(pid != 0) // parent
            {
                    dup2(fd[1],1);
                    close(fd[0]);  

                    if (execvp(cmd, *argv) == -1)
                    {
                            perror("execvp failed");
                    }
            }
            else
            {
                    dup2(fd[0],0); 
                    close(fd[1]);
            }
    }
}

int main(int argc, char** argv)
{
    assert(strcmp(argv[argc-1], "-"));

    int i;
    for (i = 1; i < argc; ++i) {
            if (!strcmp(argv[i], "-"))
            {
                    argv[i] = NULL;
                    np_exec(argv[1], &argv[1]);
                    argv = &argv[i];
                    argc -= i;
                    i = 0;
            }
    }

    char* args[argc];
    args[argc-1] = NULL;

    for (i = 1; i < argc; ++i) {
            args[i-1] = argv[i];
    }

    if (execvp(args[0], args) == -1)
            perror("execvp failed");

    return;
}

【问题讨论】:

    标签: c linux bash ubuntu pipe


    【解决方案1】:

    替换:

                       if (execvp(cmd, *argv) == -1)
    

    作者:

                   if (execvp(cmd, argv) == -1)
    

    注意事项:

    a) 您使用的警告级别是否足够高?

    b) 您必须为“execvp”添加一个“#include”。这样编译器就会自己发现这个错误。

    c) 最后一个 return 语句必须是“return 0”。同样,编译器必须警告你这个主题。

    【讨论】:

    • 非常感谢!你知道是否可以在同一行中使用两次 grep,例如:./pipe ls -l - grep 'a' - grep 'b'?
    • 几乎所有常见的 unix 命令都可以并行运行而没有任何问题“cat file | grep hello | grep bye”是一个完全合法的声明,当您的代码触发时也是如此。
    猜你喜欢
    • 2023-04-07
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多