この質問が何十億回も聞かれていることは知っていますが、すべての解決策がうまくいくわけではありません。をソケット経由でクライアントにストリーミングする必要があり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
呼び出しはエラーをスローしません。