2011-05-11 4 views
0

많은 하위 프로세스가있는 프로그램을 작성하고 있습니다. 부모는 자식에게 쓰는 파이프가 두 개 있으며, 각 파이프는 자식의 개별 파일 설명자로 dup2됩니다. 부모는 필요한 명령을 실행하는 스크립트 파일을 읽습니다. 이것은 부모에서 자식으로 파이프를 닫으려고하면 스크립트 파일의 다음 줄이 완전히 비어 있으면 이상하게 읽히는 경우를 제외하고는 잘 작동하는 것 같습니다. 만약 내가 그것을 인쇄하면 ���< 내 프로그램 (이해할 수있는)으로 무엇을 해야할지 모르겠다 나온다.파이프를 닫으면 파일에서 잘못된 라인을 읽을 수 있습니다 (파이프와 독립적입니다).

필자가 읽고있는 파일 포인터와 내가 닫고있는 파이프 사이에는 전혀 연관성이 없습니다.

라인 입력을위한 코드가 아래와 같습니다. 그것은 완벽하게 정상적으로 작동하지만,이 경우에는 제대로 작동하지 않아서 왜 작동하지 못합니다.

char *get_script_line(FILE *script) 
{ 
    char *line; 
    char charRead; 
    int placeInStr = 0; 
    int currentSizeOfStr = 80; 
    int maxStrLength = 64; 

    /* initialize the line */ 
    line = (char *)malloc(sizeof(char)*currentSizeOfStr); 

    while ((charRead = fgetc(script)) != EOF && charRead != '\n') { 
     /* read each char from input and put it in the array */ 
     line[placeInStr] = charRead; 
     placeInStr++; 
     if (placeInStr == currentSizeOfStr) { 
      /* array will run out of room, need to allocate */ 
      /* some more space */ 
      currentSizeOfStr = placeInStr + maxStrLength; 
      line = realloc(line, currentSizeOfStr); 
      } 
    } 

    if (charRead == EOF && placeInStr == 0) 
    { 
     /* EOF, return null */ 
     return NULL; 
    } 

    return line; 
} 

그리고 나는이 일을하고있어 파이프를 닫을 때 :

fflush(pipe); 
fclose(pipe); 

사람이 내가 잘못 일을 할 수있는 것의 어떤 생각을 가지고 있습니까? 아니면이 문제를 디버깅하는 방법에 대한 아이디어를 가지고 있습니까?

Start a new child and set up pipes etc 
Send EOF to one of the pipes to the child 
(BLANK LINE) 
Do something else 

그것은 그렇지 않으면 잘 작동하고 내가 의지하고 있어요 나는이 파이프를 폐쇄하고있어 상당히 확신 :

편집 : 내 입력 스크립트 (기본적으로) 다음과 같이 보일 수도 명확하게하려면 EOF를 가정으로 보내십시오.

답변

0

사실 .. 방금 고정 시켰다고 생각합니다. get_script_line에서 줄을 자유롭게하지는 못했지만 한 번 끝내면 제대로 작동하기 시작했습니다. 나는 왜 그것이 효과가 있었는지 전혀 모르겠다. 아무도 메모리를 확보하지 않으면 그 효과를 얻을 수 있다고 말할 수 있다면 흥미로울 까?

1

valgrind에서 프로그램을 실행하여 메모리 오류를 확인하는 것이 좋습니다.

+0

고마워요, 그냥 그것을보고 그것을 실행하고 잘못된 읽기/크기 n의 쓰기에 대한 오류가 힙니다. 나는이 나쁜 가정거야? 무슨 일이 일어나고 있는지 어떻게 해석할까요? 그리고 더 중요한 것은 어떻게 수정해야합니까? – Sam

관련 문제