1

strtok と dup2 を使用してあるファイルを別のファイルにリダイレクトする必要があるプログラムを作成する必要がありますが、実際にコマンド cat < file1 > file2 をシェルからではなく、代わりにユーザーに入力させる必要があります。私のプログラムを使用して。そのため、strtok が必要です。そして、私のプログラムが動かない理由は、おそらくそれが原因で、strtok がどのように機能するかをよく理解していないからです。インターネットで同様のプログラムを見つけましたが、ls コマンドを使用してファイルにリダイレクトするだけです。それでおしまい。私のプログラムはもっと複雑です。つまり、シェル内で 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 を閉じています)
  • 子プロセスは 2 つのオープンと 2 つの dup2 を実行しますが、クローズは 1 つだけです。あなたはfdを漏らしています。
  • ハードコードされたファイル名
  • 単一の「<」を探しますが、複数の「>」を検出するためのループがあります
  • <stdlib.h>のための不足exit()
  • S_IRWXUよりも読みやすいと本当に思う人はい0700ますか?

また、実際のシェルの動作に近づけることを目指している場合は、少なくともリダイレクト演算子の周りの空白を無視する必要があります。

于 2012-07-01T22:27:39.043 に答える