2

forkとexecvpを介してコマンドを実行する次の機能があります。フォークで起動したスクリプトは、入力データをリッスンしています。どうすれば myscript にデータを送信できますか?

int external_command()
{

    int pfds[2];
    if (pipe(pfds) < 0)
        return -1;

    if ((uproc.pid = fork()) == -1)
        return -1;

    if (uproc.pid == 0) {
        /* child */

        const char *argv[4];
        int i = 0;
        argv[i++] = "/bin/sh";
        argv[i++] = "myscript.sh";
        argv[i++] = NULL;

        close(pfds[0]);
        dup2(pfds[1], 1);
        close(pfds[1]);

        execvp(argv[0], (char **) argv);
        exit(ESRCH);

    } else if (uproc.pid < 0)
        return -1;

    /* parent */
    close(pfds[1]);

    int status;
    while (wait(&status) != uproc.pid) {
        DD("waiting for child to exit");
    }

    char buffer[64];
    ssize_t rxed;
    char *c;
    int t;

    //read from fork pipe
    *value = NULL;
    while ((rxed = read(pfds[0], buffer, sizeof(buffer))) > 0) {
        if (*value)
            t = asprintf(&c, "%s%.*s", *value, (int) rxed, buffer);
        else
            t = asprintf(&c, "%.*s", (int) rxed, buffer);

        if (t == -1) return -1;

        free(*value);
        *value = strdup(c);
        free(c);
    }
    // how to write to the pipe fork?
}
4

3 に答える 3

2

stdin親プロセスから子プロセスに書き込みたいということでしょうか?そのためには、2 つのパイプを作成する必要があります。stdout1 つは現在のように子供のように使用され、もう 1 つは現在stdinとほぼ同じように使用する必要があります (ただし、インデックスはもちろん逆になります)。

もちろん、wait子に書き込む前に子を処理することはできません。子が続行するために入力が必要な場合にデッドロックが発生する可能性があるためです。

于 2013-07-09T08:40:32.233 に答える