LINUX.ORG.RU

bash: pipeline в обе стороны


0

0

Вобщем нужно stdin/stdout одного процесса подключить к stdout/stdin другого, использую средства баша. Сейчас пришлось написать небольшую прогу на си, которая этим занимается, но может есть другой способ?

★★
Ответ на: комментарий от no1sm

> честно говоря не хотелось бы, можно же всё сделать с безымянными...

нечто типа

mkfifo pipe
proga1 < pipe | proga2 > pipe

должно сработать.

но как обойтись только безымянными, я себе не представляю

ananas ★★★★★
()
Ответ на: комментарий от ananas

вобщем я это дело решил сделать на си:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int Exec(const char *proc, int in, int out) {
close(0);
close(1);

dup2(in, 0);
dup2(out, 1);

execl("/bin/sh", "/bin/sh", "-c", proc, NULL);
perror("execl");
return 1;
}

int startProc(const char *proc, int in, int out)
{
pid_t pid = fork();

if (pid < 0) {
perror("fork()");
return -1;
}
/* child */
if (pid == 0) {
return Exec(proc, in, out);
}
/* parent */
return 0;
}

int main(int argc, char **argv)
{
int pipes[4];

if (argc != 3) {
fprintf(stderr, "Usage: %s p1 p2\n", argv[0]);
exit(1);
}

if (pipe(pipes) < 0) {
perror("pipe()");
exit(1);
}
if (pipe(pipes + 2) < 0) {
perror("pipe()");
exit(1);
}

startProc(argv[1], pipes[0], pipes[3]);
return Exec(argv[2], pipes[2], pipes[1]);
}

no1sm ★★
() автор топика
Ответ на: комментарий от ananas

известная фича баша - отсутствие двунаправленных пайпов

если нужно ето заюзать то юзаем ksh там ета фича кажись называется coprocess.

cvv ★★★★★
()
Ответ на: комментарий от cvv

было бы в баше что-нибудь вроде этого, по аналогии с сокетами: exec 9<>/dev/pipe ну а дальше p1 <&9 | p2 >&9

no1sm ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.