0

私のコードを以下に貼り付けます。

出力をファイルにリダイレクトするために dup2 を使用しようとしています。

リダイレクトに使用すると(コメントを削除すると)正常に動作し、標準出力ではなくファイルに出力されます。例: ls > test 、結果として ls が test に出力されます。

問題は、 > なしの ls では何も出力されないことです。リダイレクトする機能はありませんが、コメント ls 出力をそのままにしておきます。

redirect[0] は < または > のいずれかであるか、何も指定されていません。 redirect[1] はリダイレクト先のファイルのパスです。

コマンドは、コマンドのpicesを含むcstringの配列です コマンドも同様です

コードをコメントした出力例

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 に答える