シェルでのパイプの処理の書き方で困ってます
現段階でのプログラムを載せます
(質問に必要な部分を抜粋)
#include "自作のヘッダファイル(動作確認済)"
void tokun ( char str[], char *chops[], int *flagment , int *pipeflagment, int *pipe, int *num){
char *buf;
int i;
*pipeflagment = 0;
buf = str;
for(i=0; i <= SIZE ; i++){
if((chops[i] = strtok(buf," \t")) == NULL)
break;
if( *chops[i] == '|' ){
*pipeflagment = 1;
*pipe = i + 1;
*num = i;
}
buf = NULL;
}
if( *chops[i-1] == '&' ){
*flagment = BACK;
chops[i-1] = NULL;
i--;
printf("**Background Mode**\n");
}else{
*flagment = FORE;
printf("**Foreground Mode**\n");
}
if(i > SIZE){
fprintf(stderr,"Too many args\n");
exit(1);
}
}
int main ( void ){
char prompt[ 64 ] = "> ";
char command[ 256 ];
int st, id, j, pipenum, num;
char *com[256];
enum proc_flag flag;
int pipeflag ;
int out;
int pipe_fd[2];
int child, status;
char *buf;
pipeflag = 0;
fprintf(stderr, "%s", prompt);
while (gets(command) != NULL){
if( command == "quit" ){
kill(0, SIGKILL);
}
buf = command;
tokun(command, com, &flag, &pipeflag, &pipenum, &num);
//pipe部分の記述開始
if( pipeflag == 1){
com[num] = NULL;
if(pipe(pipe_fd) < 0){
perror("pipe");
exit(1);
}
if((child = fork()) < 0){
perror("fork");
exit(1);
}
if(child) {
/* parent process */
close(pipe_fd[1]);
dup2(pipe_fd[0], STDIN);
execvp (com[pipenum], com);
close(pipe_fd[0]);
if(wait(&status) < 0){
perror("wait");
exit(1);
}
}else {
/* child process */
close(pipe_fd[0]);
dup2(pipe_fd[1], STDOUT);
execvp (com[0], com);
// 通信の終了を子プロセスに通知
close(pipe_fd[1]);
}
}
//pipe部分の記述終了
if((id = fork ()) == 0){
if( execvp(com[0], com) == (-1)){
exit(1);
}
}else {
if( flag == BACK ){
waitpid(-1, NULL, WNOHANG);
fprintf(stderr, "%s", prompt);
}else {
wait(&st);
fprintf(stderr, "%s", prompt);
}
}
}
return 0;
}
パイプ部分が作れません・・・。
どうすればいいですか?
お礼
ご回答ありがとうございます。 やはりそうですよね。 その後ネットで検索して改めて調べているとそれらしい記述を見つけました。 //URLがわからなくなって貼り付けられないですが、、