0

私のプログラムは、ファイルから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);
}
4

2 に答える 2

1

あなたの問題は、ではなくをfgetc()返すことです。任意(つまり、任意のバイト)を読み取ることができるようにするため、入力された値が返されます。区別できるように 0 未満として定義されます。intcharcharfgetc()unsigned charEOF

を識別できるようにcとして定義する必要があります。そうしないと、有効な文字の値と重複し、まったく検出できない可能性があります (署名されていない場合)。intEOFchar

于 2013-03-30T02:23:08.653 に答える
0

わかった。何が問題を引き起こしたのかわかりません。ただし、ファイルの長さを事前に読み取り、x 文字が読み取られた後にループを終了するだけで、なんとか回避できました。

于 2013-03-30T13:03:57.920 に答える