パイプを使用して、あるコマンド/プログラムのstdinを別のコマンド/プログラムstdoutにリダイレクトするCプログラムを作成する必要があります。コマンドラインのプログラムに./a.out ls -l \; more
が渡された場合は、標準出力ls -l
をmore
にリダイレクトし、\;
を区切り文字にしてください。このプログラムは、私たちのパスにあるコマンド/プログラムのために動作するはずです:./a.out cat filename.c \; more
は、入力したものと同じでなければなりません:cat filename.c | more
。1つのプログラムのstdoutを別のプログラムのstdinにリダイレクトするパイプ
私の問題は、私のプログラムが正しく実行されていないか、パイプが期待どおりに動作していないことです。基本的には、私が置いたprint文のデバッグ以外の出力は得られません。具体的には、プログラムは、Exec ...とERRORを印刷します。これはすべて親コード内にあります。子供で
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void pipeit(char * pro1, char * pro2, char * p1args[], char * p2args[])
{
pid_t pid;
int fd[2];
int st;
pipe(fd);
pid = fork();
if(pid < 0)
{
printf("Error Forking...\n");
exit(-1);
}
else if(pid == 0)
{
dup2(fd[1],1);
close(fd[0]);
close(1);
printf("Exec 1...\n");
execv(pro1, p1args);
printf("ERROR\n");
}
else
{
waitpid(pid,&st,0);
if(st<0)
{
printf("Child Error\n");
}
dup2(fd[0],0);
close(fd[1]);
close(0);
printf("Exec...\n");
execv(pro2,p2args);
printf("ERROR\n");
}
return;
}
/* THIS IS JUST COMMAND LINE PARSING */
int main(int argc, char * argv[])
{
int i = 1;
char * pro1;
char * pro2;
char * first[argc+1];
char * second[argc+1];
while(i<argc && argv[i][0] != ';')
{
if(i == 1)
{
pro1 = argv[i];
}
else
{
first[i] = argv[i];
}
i++;
}
first[i] = NULL;
while(i<argc)
{
if(argv[i][0] == ';')
{
i++;
pro2 = argv[i];
}
else
{
second[i] = argv[i];
}
i++;
}
second[i] = NULL;
pipeit(pro1,pro2,first, second);
return 0;
}