Streming EXECVP OUTPUTをSOCKETを介して出力します
質問
私はこの質問が10億回尋ねられたことを知っていますが、すべての解決策は私のために働いていません。私はクライアントへのソケットを介して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);
.
iトリプルは、接続が正しく確立されていることを確認しました。 execute_cmd
を単純なwrite
に置き換えると、クライアントは答えを正しく印刷します。しかし、上記のコードを実行すると何も起こりません、私はバイトを返しません。 dup2
呼び出しを削除し、execvp
呼び出しから出力されません。
ここではかなり絶望的になった、pipe
と私が見つけることができるものは何でも試みました。どこで私は間違えましたか?コマンド自体もOK、シェル上で動作し、execvp
呼び出しはエラーをスローしません。
解決
上記のコードが正しいと判明します。問題は、
strtok
のサイレントクラッシュをもたらした以前のstrdup
を誤って使用していました。上記のfork
は単に実行されたことは決してなかったので、すべてのテストはstrtok
ラインの上にありました。printf
をコードのすべての行に入れると、問題が見つかりました。
率直に言って、私は愚かだ。
所属していません StackOverflow