私は小さなソケット通信でpoll()ループを持っています。system()またはexec()で他のプログラムを開始したいのですが、システムの戻り値が必要です/ exec()しかし、子プロセスが実行されている間にメインループを止めたくないので、スレッドで開始すると思ったが、完了したらスレッドを捕まえるためにpollfdを設定する方法がわからない。私は、だから私はたpollfd(FDS [ret.get()])への1以上を追加して、私のスレッドが実行されたときに、[2] FDSにPOLLINを取得したいと私ができるC/C++poll()catchスレッドの戻り値
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <poll.h>
#include <iostream>
#include <string>
#include <thread>
#include <future>
#define SOCKET_NAME "/tmp/9Lq7BNBnBycd6nxy.socket"
int runProgram(const std::string &programName, const std::string &fileName) {
return system((programName + " " + fileName).c_str());
}
int main(int argc, char *argv[]) {
struct sockaddr_un server;
int sock;
char buf[1024];
unlink(SOCKET_NAME);
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock == -1){
perror("socket");
exit(EXIT_FAILURE);
}
memset(&server, 0, sizeof(struct sockaddr_un));
server.sun_family = AF_UNIX;
strncpy(server.sun_path, SOCKET_NAME, sizeof(server.sun_path) - 1);
if (bind(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
if (listen(sock, 3) < -1) {
perror("listen");
exit(EXIT_FAILURE);
}
struct pollfd fds[2];
fds[0].fd = sock;
fds[0].events = POLLIN;
std::future<int> ret = std::async(&runProgram, "cat", "test.txt");
while (true) {
poll(fds, 2, -1);
if(fds[0].revents & POLLIN) {
int new_sd = accept(fds[0].fd, NULL, NULL);
if (new_sd < 0) {
perror("accept");
}
fds[1].fd = new_sd;
}
if (fds[0].revents & POLLIN) {
int rv = recv(fds[1].fd, buf, 1024, 0);
if (rv < 0)
perror("recv");
else if (rv == 0) {
printf("disconnet\n");
close(fds[1].fd);
} else {
printf("%s\n", buf);
send(fds[1].fd, buf, 1024, 0);
}
memset(buf, 0, 1024);
}
}
close(sock);
return(EXIT_SUCCESS);
}
を使用しています戻り値を取得する(ret.get())、ここで私はexapleコマンドcatを使用しましたが、最終的なコードではコマンドがより多くの時間を必要とするので、終了するのを待ちません。
コードも含めてください。 –
あなたはどのプラットフォームを使用していますか? – UKMonkey
linux g ++、私はちょうどコードを追加しました(これはオリジナルの抽出された最小化されたバージョンです) – Sekkmer