2

この質問が何十億回も聞かれていることは知っていますが、すべての解決策がうまくいくわけではありません。をソケット経由でクライアントにストリーミングする必要がありstdoutます。execvp関連するクライアントコードはこれです

static void execute_cmd(int fd, char *cmd, char **params) {
    pid_t cid;
    size_t i = 0, c = 0;

    cid = fork();

    if(cid == 0) {
        close(STDOUT_FILENO);
        dup2(fd, STDOUT_FILENO);

        if(execvp(cmd, params) < 0) {
            fprintf(stderr, "Could not execute \"%s\": %d\n", cmd, errno);
            exit(1);
        }
    } else {
        close(fd);
        waitpid(cid, NULL, 0);
        exit(1);
    }
}

この質問の回答をコピーしようとしました。ただし、次のコードを試しても何も返されません。

int sockfd = serverConnect();
write(sockfd, "echo math", 11);
n = read(sockfd, buffer, 1023);

printf("Got %d bytes\n", n);
printf("%s\n", buffer);

close(sockfd);

接続が正しく確立されていることをトリプルチェックしました。execute_cmdシンプルに置き換えるとwrite、クライアントは答えを正しく出力します。しかし、上記のコードを実行しても何も起こりません。バイトが返されません。呼び出しを削除しましたが、dup2呼び出しからの出力もありませんexecvp

ここでかなり必死になって、pipe私が見つけたものは何でも試してみました。どこで私は間違えましたか?コマンド自体も問題なく、シェルで動作し、execvp呼び出しはエラーをスローしません。

4

1 に答える 1

0

上記のコードが正しいことがわかりました。strtok問題は、のサイレント クラッシュを引き起こす以前の の不適切な使用でしたstrdup。上記forkはまったく実行されておらず、すべてのテストはstrtok一線を超えていました。コードのすべての行に s を入れてprintf初めて、問題を見つけることができました。

率直に言って、私はばかげていると感じています。

于 2014-06-05T09:56:26.840 に答える