#include <stdlib.h>
#include <unistd.h>
void infinit_pipe(char ***cmd)
{
int p[2];
pid_t pid;
int fd_in = 0;
int i = 0;
while (cmd[i] != NULL)
{
pipe(p);
if ((pid = fork()) == -1)
{
}
else if (pid == 0)
{
dup2(fd_in, 0);
if (cmd[i+1] != NULL)
dup2(p[1], 1);
close(p[0]);
execvp((cmd)[i][0], cmd[i]);
}
else
{
wait(NULL);
close(p[1]);
fd_in = p[0];
i++;
}
}
}
int main()
{
char *ls[] = {"ls", NULL};
char *grep[] = {"find", ".", "-name", "*", NULL};
char *wc[] = {"wc", NULL};
char **cmd[] = {ls, grep, wc, NULL};
infinit_pipe(cmd);
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8dW5pc3RkLmg+Cgp2b2lkICAgIGluZmluaXRfcGlwZShjaGFyICoqKmNtZCkKewogIGludCAgIHBbMl07CiAgcGlkX3QgcGlkOwogIGludCAgIGZkX2luID0gMDsKICBpbnQgICBpID0gMDsKCiB3aGlsZSAoY21kW2ldICE9IE5VTEwpCiAgICB7CiAgICAgIHBpcGUocCk7CiAgICAgIGlmICgocGlkID0gZm9yaygpKSA9PSAtMSkKICAgICAgICB7CiAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgZWxzZSBpZiAocGlkID09IDApCiAgICAgICAgewogICAgICAgICAgZHVwMihmZF9pbiwgMCk7CiAgICAgICAgICBpZiAoY21kW2krMV0gIT0gTlVMTCkKICAgICAgICAgICAgZHVwMihwWzFdLCAxKTsKICAgICAgICAgIGNsb3NlKHBbMF0pOwogICAgICAgICAgZXhlY3ZwKChjbWQpW2ldWzBdLCBjbWRbaV0pOwogICAgICAgICAgZXhpdCgyKTsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICB3YWl0KE5VTEwpOwogICAgICAgICAgY2xvc2UocFsxXSk7CiAgICAgICAgICBmZF9pbiA9IHBbMF07CiAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbigpCnsKICBjaGFyICpsc1tdID0geyJscyIsIE5VTEx9OwogIGNoYXIgKmdyZXBbXSA9IHsiZmluZCIsICIuIiwgIi1uYW1lIiwgIioiLCBOVUxMfTsKICBjaGFyICp3Y1tdID0geyJ3YyIsIE5VTEx9OwogIGNoYXIgKipjbWRbXSA9IHtscywgZ3JlcCwgd2MsIE5VTEx9OwoKICBpbmZpbml0X3BpcGUoY21kKTsKfQo=