0

コマンドを bash シェル (/bin/sh) に送受信するプログラムを作成しようとしています。bash シェルのラッパー プログラムのように。したがって、stdin に「cd ~/Desktop」と書き込んでから、もう一度「ls」と書き込めば、デスクトップ上のファイルのリストを受け取ることができます。私はそれを機能させることはできません。このコードの 2 番目の書き込みコマンドでは、stdin に書き込んだ内容がすべてエコー バックされます。popen() も使用してみましたが、出力のみが提供され、標準入力に書き込むことはできません。誰かがこの問題を解決するのを手伝ってくれませんか? ありがとう

void main()
{
    // Create a pipe and fork
    //
    int fd[2];
    int p = pipe(fd);
    pid_t pid = fork();

    if (pid > 0)
    {
        // Read from the pipe and output the result
        //
        //close(fd[1]);
        char buf[1024] = { 0 };

        read(fd[0], buf, sizeof(buf));

        printf("1 - %s\n", buf);

        write (fd[1], "ifconfig", strlen ("ifconfig") );

        // problem is here, read is returning echo'd bytes from write()

        read(fd[0], buf, sizeof(buf));

        printf("2 - %s\n", buf);    


        // Wait for child to terminate
        int status;
        wait(&status);
    }
    else if (pid == 0)
    {
        // Redirect stdout and stderr to the pipe and execute the shell
        // command
        //
        dup2(fd[0], STDIN_FILENO);
        dup2(fd[1], STDOUT_FILENO);
        dup2(fd[1], STDERR_FILENO);
        //close(fd[0]);
        execl("/bin/sh", "exec sh", "-c", "ls", (char*) NULL );
    }

}

編集 - 最初の回答ごとにコードを更新しました。現在、2 番目の read() 呼び出しからの出力はありません。

void main()
{
    // Create a pipe and fork
    //
    int fd[2];

int ChildToParent[2], ParentToChild[2];



    pipe (ParentToChild);
pipe (ChildToParent);

    pid_t pid = fork();

    if (pid > 0)
    {
        // In parent process

        // Read the output of the child from child_to_parent[0]
        // We don't need child_to_parent[1] so close it
        close(ChildToParent[1]);

        // Write output to the child using parent_to_child[1]
        // We don't need parent_to_child[0] so close it
        close(ParentToChild[0]);

        // Read from and write to the child process...
        char buf[1024] = { 0 };

        read(ChildToParent[0], buf, sizeof(buf));   
    printf("1 - %s\n", buf);


    write(ParentToChild[1], "whoami", strlen ("whoami") );

    memset (buf, 0, 1024);

    // this call to read returns nothing
    read(ChildToParent[0], buf, sizeof(buf));
    printf("2 - %s\n", buf);



    }
    else if (pid == 0)
    {
        // Redirect stdout and stderr to the pipe and execute the shell
        // command
        //
    // child_to_parent[1] is were we write output, it's the
        // new standard output, child_to_parent[0] can be closed
        dup2 (ChildToParent[1], STDOUT_FILENO);
        close(ChildToParent[0]);

        // parent_to_child[0] is where we read input from, it's the
        // new standard input, parent_to_child[1] can be closed
        dup2 (ParentToChild[0], STDIN_FILENO);
        close(ParentToChild[1]);

        //close(fd[0]);
        execl("/bin/sh", "exec sh", "-c", "ls", (char*) NULL );
    }

}

4

1 に答える 1