在EOF之后,程序继续从重定向的stdin读取

时间:2013-03-30 02:13:20

标签: c unix stdin eof

我的程序应该从文件中读取unix命令,执行它,将结果保存到文件中。如果我只是尝试从控制台运行它,执行就没有问题。但是,如果我将输入重定向到文件,它会由于某种原因继续永久读取。我想我可能没有正确地检测EOF,但这种方法似乎以前有用。

我试过调试,结果真的很奇怪。或带有输入

的文件的示例
echo blablabla
true
false

它的输入行将按顺序

echo blablabla
true
falseecho blablabla

好像它读了标准输出?还是stdin?但是,如果我只是从控制台提供输入,它就可以工作。

FILE* script;
script=freopen(argv[argc-1], "r", stdin);
if(script==0){
  printf( "Error 1\n" );
  return 1;
}
int c;

while((c=fgetc(stdin))){
    if(c==EOF || c==4 || c<0){
        c='\n';
        exitLoop=true;
    }
    if(c!='\n'){
        inLine[i]=c;
        inLine[i+1]=0; //shouldn't be needed, but just in case
        i++;
    }else{
        inLine[i]=0;
        printf("inLine: %s i:%d\n\n",inLine,i);
        sleep(1);
        int result= 0;
        result= fork();
        if(result<0){
           printf("Failed creation of a new process. Most likely not enough memory\n");
           return 1;
        }else if(result==0){
           short int ak=childFunction(inLine,logPath,searchPath);
           return ak;
        }else if(result>0){
           int status=0;
           int d=(int)waitpid(result,&status,0);
        }else
           return -1;
        }
        i=0;
        if(exitLoop==true)
        break;
    }
}

编辑:

int childFunction(char in[],char logPath[], char searchPath[]){
FILE *logFile= fopen( logPath, "a" );
if(logFile==NULL)
return 1;
char** argv;
int stringCount=1;
char* path;
int i=0,j=0;
for(i=0;in[i]!=0;i++){
    if(in[i]==' ' || in[i]=='\t'){
        in[i]=0;
        stringCount++;
    }
}
argv = malloc(sizeof(char*)*(stringCount+1));
i=0;
argv[0]=in;
j++;
while(j<stringCount){
    if(in[i]==0){
        argv[j]=in+i+1;
        j++;
    }
    i++;
}
argv[stringCount]=NULL;
int processId=fork();
if(processId<0){
    printf("Error while forking.\n");
    exit(1);
}else if(processId==0){
    return execv(in,argv);
}
int c=0;
waitpid(processId,&c,0);
c=errno;
fprintf(logFile,"%d: %s\n", c, in);
fclose(logFile);
free(argv);
if(c!=0)
return(1);
else
return(0);
}

2 个答案:

答案 0 :(得分:1)

您的问题是fgetc()返回int,而不是char。由于您希望能够读取任何char(即任何字节)fgetc(),因此将返回输入的unsigned char值。 EOF被定义为小于0,因此可以区分它。

您需要将c定义为int,以便您可以识别EOF,否则它会与某些有效字符的值重叠,而您发现的可能根本无法检测到(如果char未签名)。

答案 1 :(得分:0)

好。不知道是什么导致了这个问题。我确实设法绕过它,通过事先读取文件的长度,并在读取x个字符后简单地退出循环。