Вам не нужны именованные каналы; безымянные трубы работают просто отлично. На самом деле, часто вы можете просто использовать popen
вместо того, чтобы делать pipe
/ fork
/ dup
/ exec
самостоятельно. popen
работает так (хотя ваша реализация libc
, вероятно, имеет больше проверки ошибок):
FILE *popen(const char *command, const char *type) {
int fds[2];
const char *argv[4] = {"/bin/sh", "-c", command};
pipe(fds);
if (fork() == 0) {
close(fds[0]);
dup2(type[0] == 'r' ? 0 : 1, fds[1]);
close(fds[1]);
execvp(argv[0], argv);
exit(-1);
}
close(fds[1]);
return fdopen(fds[0], type);
}
Это создает безымянный канал и fork
s. В дочернем объекте он присоединяет стандартный вывод (или стандартный ввод) к одному концу канала, а затем exec
дочерний. Родитель может просто читать (или писать) с другого конца канала.