Я практикую C-код с системным вызовом pipe, он хорошо работает с небольшими порциями данных. но когда данные выходят за пределы пропускной способности канала, возникает мертвая блокировка.
Моя тестовая система - Debian Sid, но я считаю, что она имеет общий язык с другими дистрибутивами Linux. Этот фрагмент кода работает хорошо, в то время как входной файл '/tmp/a.out' достаточно мал, чтобы поместиться в канале, но заблокирован, так как размер файла составляет до 1M.
#include <sys/errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdio.h>
#define CHUNK 2048
int main() {
int fd=open("/tmp/a.out",O_RDONLY);
int pin[2];
int pout[2];
int nread;
char buff[CHUNK];
pipe(pin);
pipe(pout);
int rc;
pid_t pid=fork();
if (pid == 0) {
close(pin[1]);
dup2(pin[0],STDIN_FILENO);
close(pout[0]);
dup2(pout[1],STDOUT_FILENO);
execlp("cat","cat",(char *)0);
} else if (pid > 0) {
close(pin[0]);
close(pout[1]);
/* I think dead lock occurs here, but i can't figure out a way to avoid it */
while ( (nread=read(fd,buff,CHUNK)) > 0) write(pin[1],buff,nread);
close(pin[1]);
while ( (nread=read(pout[0],buff,CHUNK)) >0) write(STDOUT_FILENO,buff,nread);
waitpid(pid,&rc,0);
exit(rc);
} else {
perror("fork");
exit(errno);
}
}
Есть предложения? Я знаю, что у класса подпроцесса Python есть что-то вроде subprocess.communicate (), чтобы избежать такой блокировки, но я не знаю, как с этим справиться в C.
Большое спасибо.