我的程序应该从文件中读取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);
}
答案 0 :(得分:1)
您的问题是fgetc()
返回int
,而不是char
。由于您希望能够读取任何char
(即任何字节)fgetc()
,因此将返回输入的unsigned char
值。 EOF
被定义为小于0,因此可以区分它。
您需要将c
定义为int
,以便您可以识别EOF
,否则它会与某些有效字符的值重叠,而您发现的可能根本无法检测到(如果char
未签名)。
答案 1 :(得分:0)
好。不知道是什么导致了这个问题。我确实设法绕过它,通过事先读取文件的长度,并在读取x个字符后简单地退出循环。