私のプログラムは、ファイルからunixコマンドを読み取り、実行し、結果をファイルに保存することになっています。コンソールから実行するだけなら、実行に問題はありません。ただし、入力をファイルにリダイレクトすると、何らかの理由で永遠に読み続けられます。EOF を適切に検出していない可能性があると思いますが、このアプローチは以前は機能していたようです。
デバッグを試みましたが、結果は本当に奇妙です。または入力のあるファイルの例
echo blablabla
true
false
入力行は、順番に
echo blablabla
true
falseecho blablabla
stdoutを読んだかのように?それとも標準入力?しかし、コンソールから入力を提供するだけで機能します。
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);
}