1

次のコードがあります。

int pfds[2], pid;

if (socketpair(AF_UNIX, SOCK_STREAM, 0, pfds) < 0) {
        goto error;
}

if ((pid = fork()) == -1)
    goto error;

if (pid == 0) {
    /* child */
    close(pfds[1]);
    dup2(pfds[0], 1);
    close(pfds[0]);
    const char *argv[5];
    int i = 0;
    argv[i++] = "/bin/sh";
    argv[i++] = "/sbin/script.sh";
    argv[i++] = NULL;
    execvp(argv[0], (char **) argv);
    exit(ESRCH);
}
close(pfds[0]);
s.stream.string_data = true;
s.stream.notify_read = client_read_cb;
ustream_fd_init(&s, pfds[1]);

echoスクリプトは、スクリプトの読み込みの終了を示す文字列 (コマンドで出力) を返します。

によって返された文字列を読み取るにはどうすればよい/sbin/script.shですか?

4

1 に答える 1

1

基本的に、execv を実行する子プロセスと、読み取りを行う親プロセスとの区別がありません。

char readbuffer[100];

if(pid == 0)
   ...
else
{
    close(pdfs[0];
    nbytes = read(pfds[1], readbuffer, sizeof(readbuffer));
}

ただし、スクリプトの終了を待ちたい場合は、子プロセスで wait_pid を実行できます。

于 2013-07-08T14:32:31.920 に答える