특정 논리를 하위 프로세스에 위임 할 기존 코드가 있습니다. 요구 사항은 부모가 파이프에 쓰고 자식이 파이프에 읽는 것입니다. 읽은 후에, 자식은 새로운 파이프에 무엇인가를 쓴다. 그리고 부모는 그것을 읽는다.양방향 읽기/쓰기를위한 파이프 액세스 동기화
아래 코드에서 send() 함수는 부모 프로세스의 전용 스레드에 의해 주기적으로 호출됩니다.
LaunchWorker()는 하위 프로세스가 처음 호출 될 때만 fork됩니다.
1) 두 디스크립터의 읽기 및 쓰기 끝을 닫는 방법을 알아낼 수 없기 때문에 파이프에 쓰여진 이전 데이터가 모든 쓰기에 플러시됩니다. 2) 두 개의 설명자에 대해 두 번 필요한 pipe() 호출 중입니까?
이 코드 작업을위한 모든 입력 사항을 크게 높이 실 것입니다. 감사합니다.
typedef struct
{
WebClient* wc; // user defined class
string url;
string data;
size_t dataLen;
DownloadObserver* downloadCallback; // user defined class
string* token;
}Payload;
PayLoad pl;
static pid_t worker_pid = 0;
int fd1[2];
int fd2[2];
bool done = false;
void LaunchWorker()
{
if (worker_pid != 0)
{
return;
}
pipe(fd1);
pipe(fd2);
worker_pid = fork();
}
void send()
{
//populate pl;
LaunchWorker();
if (worker_pid == 0)
{
while(true)
{
close(fd1[1]);
close(fd2[0]);
int cr = read(fd1[0], &pl, sizeof(Payload));
if (cr > 0)
{
// Upload some data to a remote http endpoint - uses libcurl
//if upload success, done = true
int cw = write(fd2[1], &done, sizeof(bool));
if (cw > 0)
{
// success
}
else
{
// failure
}
}
else
{
// failure
}
}
}
else if (workper_pid > 0)
{
close(fd1[0]);
close(fd2[1]);
int pw = write(fd1[1], &pl, sizeof(Payload));
if (pw > 0)
{
int pr = read(fd2[0], &done, sizeof(bool));
if (pr > 0)
{
// do something with value read
}
else
{
// failure
}
}
else
{
failure
}
}
}
예 파이프를 두 개 만들려면 'pipe'를 두 번 호출해야합니다. 이것은 파이프가 단방향이므로 단방향입니다. 감사합니다. –
. 내 첫 번째 질문에 대해서는 코드에서 close()를 호출해야하는 순서에 대한 팁이 있습니까? – user2930006
각 프로세스에서 사용하지 않는 설명자를 닫아야합니다 (예 : 하위 프로세스의 fd1 [1]). 그 외에는 파이프 설명자를 닫을 필요가 없습니다. 어떤 종류의 "동기화"가 필요한지 잘 모르겠습니다. 많은 양의 데이터를 보내고 있습니까? 'Payload'의 크기는 얼마입니까? –