1

我必须编写一个程序,在其中我需要使用 strtok 和 dup2 将一个文件重定向到另一个文件,但我还需要让用户实际输入命令 cat < file1 > file2,但不是来自 shell,而是通过使用我的程序。这就是为什么我需要strtok。而我的程序无法运行的原因可能就是因为这个,因为我并不真正了解 strtok 是如何工作的。我在互联网上找到了一个类似的程序,但他们只是使用 ls 命令并将其重定向到文件。而已。我的程序要复杂得多。我的意思是,在 shell cat < file1 > file2 中说会更容易,但出于某种原因,他们希望我们这样做。所以,无论如何,这就是我到目前为止所拥有的(这里我只是将我在互联网上找到的内容与我之前已经拥有的内容结合起来。我们必须做类似的事情,但用户只需要使用 ls 或 ls -l。很简单的东西。至少对我来说,这要困难得多。)

 #include <fcntl.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <errno.h>
 #include <sys/wait.h>
 #include <string.h>


 int main() {
     pid_t pid;
     char line[256];
     char *args[129];
     int i;
     int fd;
     int status;
     char *temp;

     while (1) {
            printf(">");
            if (fgets(line, 256, stdin) == 0) {
                 exit(0);
        }
            else {
            pid = fork();
            if (pid == 0) {
                i = 0;
                temp = strtok("<",line);
                while (temp != NULL) {
                   args[i++] = temp;
                   temp = strtok(">",line);
                   args[i] = '\0';
                 }
                fd = open("hello", O_RDONLY);
                dup2(fd, STDIN_FILENO);
                fd = open("world", O_WRONLY|O_CREAT|O_TRUNC, S_IRWXU);
                dup2(fd, STDOUT_FILENO );
                close(fd);
                execvp(args[0], args); 
               } 

              else {
                  close(fd);
                  wait(&status);
              }
            }
       } 
    }

任何帮助将不胜感激。

4

1 回答 1

1

除了倒退的strtok论点,还有其他问题。

  • 父进程关闭fd它从未打开过(它是一个未初始化的变量,所以你正在关闭一个可能不存在的随机 fd)
  • 子进程进行两次打开和两次 dup2,但只有一次关闭。您正在泄漏 fd。
  • 硬编码的文件名
  • 您寻找单个“<”,但有一个用于检测多个“>”的循环
  • 缺乏<stdlib.h>exit()
  • 谁真的认为S_IRWXU比 更具可读性0700

如果您的目标是近似真实 shell 的行为,您至少应该忽略重定向运算符周围的空格。

于 2012-07-01T22:27:39.043 回答