質問

私はこの質問が10億回尋ねられたことを知っていますが、すべての解決策は私のために働いていません。私はクライアントへのソケットを介してstdoutexecvpをストリーミングする必要があります。関連するクライアントコードはこれです

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);
.

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

ここではかなり絶望的になった、pipeと私が見つけることができるものは何でも試みました。どこで私は間違えましたか?コマンド自体もOK、シェル上で動作し、execvp呼び出しはエラーをスローしません。

役に立ちましたか?

解決

上記のコードが正しいと判明します。問題は、strtokのサイレントクラッシュをもたらした以前のstrdupを誤って使用していました。上記のforkは単に実行されたことは決してなかったので、すべてのテストはstrtokラインの上にありました。printfをコードのすべての行に入れると、問題が見つかりました。

率直に言って、私は愚かだ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top