c - 从 execvp 将 stdout 写入文件

标签 c redirect fork execvp dup2

为什么 execvp 不写入重定向的 STDOUT? 我尝试使用 printf() 作为此 block 中的测试,并且它准确地写入了它应该写入的位置,即我将 STDOUT 重定向到的文件中。

编辑:我更改了代码,添加了 makesubcommand 的实现,并添加了一些调试消息。

pid = fork();
    wait(0);
    if(pid == 0)
    {
        fd = open(subargs[next_redirect + 1], O_CREAT|O_TRUNC|O_WRONLY, 0644);
        dup2(fd, STDOUT_FILENO);
        close(fd);
        //create sub-command
        int val = (next_redirect - (last_redirect + 1));
        fprintf(stderr,"subcommand will have %i indexes\n", val);
        char* subcommand[val];
        makesubcommand(subcommand, subargs, last_redirect + 1, next_redirect);
        execvp(subcommand[0], subcommand);
        fprintf(stderr,"execvp failed\n");
    }
    last_redirect = next_redirect;
    next_redirect = getnextredirect(subargs, last_redirect+2, subargc);

这里是 makesubcommand(4):

void makesubcommand(char** newcommand, char** oldcommand, int lowerbound, int upperbound)
{
    int i;
    fprintf(stderr, "lowerbound: %i upperbound: %i\n",lowerbound, upperbound);
    for(i = lowerbound; i < upperbound; i++)
    {
        fprintf(stderr,"subarg[%i]: %s\n", (i-lowerbound), oldcommand[i]);
        newcommand[i - lowerbound] = oldcommand[i];
    }
    for(i = lowerbound; i < upperbound; i++)
    {
        fprintf(stderr, "newcommand[%i] = %s\n",(i - lowerbound), newcommand[i]);
    }
    fprintf(stderr, "it worked\n");
}

这是一个测试运行:

{12425}/home/chris/2240New/WMU-CS2240/A3_Shell$ ls > a
subcommand will have 1 indexes
lowerbound: 0 upperbound: 1
subarg[0]: ls
newcommand[0] = ls
it worked
execvp failed

最佳答案

我的问题最终是我需要为子命令分配内存。 malloc 成功了!

关于c - 从 execvp 将 stdout 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22474458/

相关文章:

对来自具有两个输入的机械水表的脉冲进行计数

C GLFW 如何设置窗口的最小尺寸?

.htaccess - htaccess 如何仅重定向根而不重定向其他页面

ruby - 如何使用 Daemons gem 获取第一个任务的 pid?

c - c 中 fork() 的输出

c - 加载二进制文件 - realloc() : invalid next size

c - 已编译编译器对已编译代码的性能

php - htaccess 基于查询字符串的 url

javascript - 重定向 localhost 而不是 myserver.org :3000/login/callback

c - 父进程收到信号后运行两次