0

我的代码粘贴在下面。

我正在尝试使用 dup2 将我的输出重定向到文件。

如果我用它来重定向它工作正常(如果我删除评论),输出文件而不是标准输出。例如: ls > test ,导致 ls 输出到测试。

问题是没有 > 的 ls 不会输出任何东西。如果我按原样保留评论 ls 输出,尽管无法重定向。

redirect[0] 是 < 或 > 或什么都没有 redirect[1] 是要重定向到的文件的路径

command is 是一个 cstrings 数组,其中包含命令 commands 的图片

带有注释代码的示例输出

xxxxx@myshell:/home/majors/kingacev/ubuntumap/cop4610/proj1> ls
a.out  myshell.c  myshell.c~
xxxxx@myshell:/home/majors/kingacev/ubuntumap/cop4610/proj1>

代码未注释

xxxxx@myshell:/home/majors/kingacev/ubuntumap/cop4610/proj1> ls
xxxxx@myshell:/home/majors/kingacev/ubuntumap/cop4610/proj1>


  /*
  if (!strcmp(redirect[0],">")){
    if ((fd = open(redirect[1], O_RDWR | O_CREAT)) != -1)
      dup2(fd, STDOUT_FILENO);
    close(fd);
  }
  */

  if (command[0][0] == '/'){
    int c = execv(command[0], commands);
    if (c != 0){
      printf("ERROR: command does not exist at path specified\n");
      exit(0);
    }
  }
  else if (!execv(path, commands)){
    exit(0);
  }
4

1 回答 1

0

此代码有效,重定向到file.out

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

int main(void)
{
    int fd;
    char *redirect[] = { ">", "file.out" };
    char *command[] = { "/bin/ls", "-l", 0 };

    if (!strcmp(redirect[0], ">"))
    {
        if ((fd = open(redirect[1], O_WRONLY | O_CREAT, 0644)) != -1)
        {
            fprintf(stderr, "Dupping stdout to %s\n", redirect[1]);
            dup2(fd, STDOUT_FILENO);
            close(fd);
        }
    }

    if (command[0][0] == '/')
    {
        execv(command[0], command);
        fprintf(stderr, "ERROR: command %s does not exist at path specified\n", command[0]);
        return(1);
    }
    else
    {
        fprintf(stderr, "ERROR: not handling relative names like %s\n", command[0]);
        return(1);
    }
    return 0;
}

此代码也有效,不会重定向到文件:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

int main(void)
{
    int fd;
    char *redirect[] = { "<", "file.in" };
    char *command[] = { "/bin/ls", "-l", 0 };

    if (!strcmp(redirect[0], ">"))
    {
        if ((fd = open(redirect[1], O_WRONLY | O_CREAT, 0644)) != -1)
        {
            fprintf(stderr, "Dupping stdout to %s\n", redirect[1]);
            dup2(fd, STDOUT_FILENO);
            close(fd);
        }
    }

    if (command[0][0] == '/')
    {
        execv(command[0], command);
        fprintf(stderr, "ERROR: command %s does not exist at path specified\n", command[0]);
        return(1);
    }
    else
    {
        fprintf(stderr, "ERROR: not handling relative names like %s\n", command[0]);
        return(1);
    }
    return 0;
}

请注意,它设置了command数组并使用execv(command[0], command);——这是推荐的业务方式。您的代码似乎有一个变量commands,其中可能是程序的参数;您似乎还有一个变量path,可能是程序的路径名。由于我们看不到其中的内容,因此很难知道它们包含什么以及可能存在问题的地方。请注意数组0末尾的显式空指针 ( )。command这是至关重要的。还要注意,错误消息会识别失败的原因。没有什么比一个程序说“它出错了”而不识别“它”是什么更令人沮丧的了。

于 2014-01-30T14:28:47.513 回答