3

私はリダイレクト機能を備えたシェルを実装することになっていますが、ファイル記述子の操作方法について頭か尻尾を作るのに苦労しています。ここの私のtest.cファイルでは、テストを「python --version」から「out」というファイルにパイプしようとしています。

int main(int argc, char *argv[], char *const envp[])
{
/***/TOKENIZER *tester;
    int pid = 0;
    int pipefd[2];
    char buffer = 0;

    pipe(pipefd); 
    pid = fork();
    pipefd[1] = open("out", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);

    if(pid == 0){
        close(pipefd[1]);
        dup2(pipefd[0], STDIN_FILENO); 
        close(pipefd[0]);
        while(read(STDIN_FILENO, &buffer, 1) > 0){
            write(STDOUT_FILENO, &buffer, 1);
        }

        close(pipefd[0]);
        _exit(EXIT_SUCCESS);
    }else{
        close(pipefd[0]);
        dup2(pipefd[1], STDOUT_FILENO); 
        close(pipefd[1]);

        write(STDOUT_FILENO, "asdsd\n", 6);

        char* ver[2];
        ver[1] = "--version";
        execvp("python", ver);
        exit(EXIT_SUCCESS);
    }
    free(tester);


    return 0;

編集:リダイレクトとパイプアップの一部を混ぜていたことに気づきました。これが私が実行しようとしているリダイレクトコードです。

int out = open("output.txt", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);

dup2(out, 1);
close(out);

char* ver[2];
ver[1] = "--version";
execvp("python", ver);
exit(EXIT_SUCCESS);

return 0;

Python のバージョン管理を output.txt に取り込もうとしていますが、機能していないため何かが足りないようです。

編集 2: 実行しているように見えますが、output.txt ではなく標準出力に出力しています。

int out = open("output.txt", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IRGRP | S_IWGRP | S_IWUSR);
dup2(out, STDOUT_FILENO);

char* ver[3];
ver[0] = "python";
ver[1] = "--version";
ver[2] = NULL;
execvp("python", ver);
perror("exec");

return 0;
4

1 に答える 1