c - EOF 后程序继续从重定向的 stdin 读取

标签 c unix stdin eof

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

我尝试过调试,结果很奇怪。或带有输入的文件的示例

echo blablabla
true
false

它的输入行将按顺序排列

echo blablabla
true
falseecho blablabla

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

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);
}

最佳答案

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

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

关于c - EOF 后程序继续从重定向的 stdin 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15714167/

相关文章:

java - 如何告诉这个Java方法在某种条件下再次执行自己?

c - 找出2个相似或不相似的字符串

java - 当我没有传递此字符串时,会显示 09▀30≈ß#@÷g

linux - 将两个文本列表(一个列表一个文件)粘贴到一个列表中,以分号分隔

c++ - 使用 OpenSSL 和 C++ 生成 sha256

java.nio.file.path : inconsistent behaviour with name count?

python - Argparse 和 ArgumentDefaultsHelpFormatter。选择 sys.stdin/stdout 作为默认值时的默认值格式

c - setsockopt() 不解除绑定(bind)

c++ - 如何在不使用变量 C/C++ 的情况下将常量数组文字传递给采用指针的函数?

c - 如果指向标准输入,是什么让 fgets() 实际上等待用户输入?