[英]multiple piping in C shell
谁能告诉我这段代码有什么问题。 我能够成功地写入管道,但是当我将管道输出端用作另一个命令的输入时,却无法获得输出。 下面是代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> //for pid_t fork() and other system calls
#include <signal.h> //for signal()
#include <sys/types.h>
void command_EXECUTER(char *args[]);
void command_HANDLER(char *args[]);
int pipe_EXECUTER(char *args[], int in, int pos);
void shell_INIT(){
int is_interactive = isatty(STDOUT_FILENO);
if(is_interactive){
}
}
int main(int argc, char *argv[], char **envp){
char shell_INPUT[1024];
char *tokens[256];
int tok_counts = 0;
while(1){
memset(shell_INPUT,'\0',sizeof(shell_INPUT));
printf("\n%s@%s: ",getenv("USER"),getenv("SESSION"));
fgets(shell_INPUT,1024,stdin);
if((tokens[0] = strtok(shell_INPUT," \n)\t")) == NULL) continue;
tok_counts = 1;
while((tokens[tok_counts] = strtok(NULL, " \n\t")) != NULL) tok_counts++;
/*
int i=0;
while(tokens[i]){
printf("%s ",tokens[i]);
i++;
}
tokens[tok_counts] = NULL;*/
command_HANDLER(tokens);
}
return 0;
}
int fileIO_EXECUTER(char *args[], int in, int pos){
int fd;
pid_t pid;
if((pid=fork())==0){
switch(pos){
case 0:
dup2(fd, STDOUT_FILENO);
break;
}
}
}
int pipe_EXECUTER(char *args[], int in, int pos){
int fd[2];
pid_t pid;
pipe(fd);
if((pid=fork())==0){
printf("%s %s %s %d\n",args[0],args[1],args[2],pid);
fflush(stdout);
switch(pos){
case 0: dup2(fd[1], STDOUT_FILENO); //first command
//close(fd[1]);
break;
case 1: dup2(in, STDIN_FILENO); //in between command
dup2(fd[1], STDOUT_FILENO);
//close(fd[1]);
break;
case 2: dup2(in, STDIN_FILENO); //last command
//close(fd[1]);
break;
default: printf("wrong input variable\nexiting");
exit(1);
}
if(execvp(args[0],args)==-1) printf("%s: command not found",args[0]); fflush(stdout); kill(getpid(),SIGTERM);
}else if(pid<0){
printf("couldn't create child");
exit(1);
}else{
wait(pid);
}
return fd[0];
}
void command_EXECUTER(char *args[]){
pid_t pid;
if((pid=fork())<0){
printf("couldn't create the child");
exit(1);
}
else if(pid==0){
if((execvp(args[0],args))==-1) printf("%s: command not found",args[0]); fflush(stdout); kill(getpid(),SIGTERM);
}
else wait(pid);
}
void command_HANDLER(char *args[]){
int i=0;
int j=0;
char spec_chars[100];
while(args[i]){
if((strcmp(args[i],">")==0) || (strcmp(args[i],"<")==0) || (strcmp(args[i],"|")==0) || (strcmp(args[i],"&")==0) || (strcmp(args[i],"$")==0)){
spec_chars[j] = *args[i];
j++;
}
i++;
}
if(j==0){
if(strcmp(args[0],"exit")==0) exit(0);
else if(strcmp(args[0],"clear")==0) system("clear");
else command_EXECUTER(args);
}
else{
int in = 0;
int h = 0;
int pos=0;
char data[1024];
int k=i;
i = 0;
while(args[i]){
if(strcmp(args[i],"|")==0){
args[i] = (char *)NULL;
in = pipe_EXECUTER(args,in,pos);
int n = read(in,data,sizeof(data));
printf("%s %d\n",data,n);
fflush(stdout);
args = args+i+1;
//printf("%s something %s",args[0],args[1]);
pos = 1;
i=0;
}else if(strcmp(args[i],"<")==0){
}else if(strcmp(args[i],">")==0){
}else if(strcmp(args[i],"&")==0){
}
else{
i++;
}
}
in = pipe_EXECUTER(args,in,2);
}
}
例如,如果我使用
ls | 分类
'in'描述符中将包含ls,但是当通过'sort'访问相同的输出时,它将挂在那里...否则执行该命令的子代永远不会死亡,并且由于该父代一直在等待。
“在”描述符中将包含ls,但是当通过“ sort”访问相同的输出时,它将挂在那里
这是由于未在父进程中关闭管道的写端而造成的,因为sort
自然会一直等到所有引用写端的文件描述符都被关闭,从而确保不再有输入到达。 因此,在pipe_EXECUTER()
,必须在return fd[0];
之前调用close(fd[1])
return fd[0];
当然还有调试代码
int n = read(in,data,sizeof(data));
printf("%s %d\n",data,n);
必须删除command_HANDLER()
中的内容,以免将输入用于sort
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.