2017-04-21 1 views
0

출력을 파일로 재지 정해야하는 쉘에 함수를 작성하고 있습니다. 예를 들어 사용자 쓰기 : ls -l >> filels -l은 파일에 기록해야합니다. 거의 모든 것이 정확하지만 처음에는 함수 프로그램을 중지 한 후에 다른 것을 쓸 수 없습니다. 내 기능을 제시하고 내가 문제를 해결하기 위해 어떤 단서를 부탁드립니다 아래 :dup2 이후 사용자 정의 쉘이 작동을 멈춤

void execute2(char *command, char **argv, char **argv2) 
{ 
    pid_t pid; 
    int status; 

    if ((pid = fork()) < 0) 
    {  
     printf("*** ERROR ***\n"); 
      exit(1); 
    } 
    else if (pid == 0) 
    {  
     close(1);  
     parse(command, argv, argv2); 
     int output = open(*argv2, O_APPEND | O_WRONLY); 
     dup2(output,1);  
     if (strcmp(argv[0], "exit") == 0) 
      exit(0);  
     if (execvp(*argv, argv) < 0) 
     {  
      printf("*** ERROR ***\n"); 
      exit(1); 
     } 
     close(output); 
    } 
    else 
    {         
     while (wait(&status) != pid); 
    } 
} 

command은 사용자로부터 얻는 명령은 argv이 명령 및 매개 변수와 argv2 출력 파일이의 일부입니다.

+1

'dup2 (출력, 1)'다음에'execvp()'- 바람직하게는'strcmp()'이전에'close (출력) '해야합니다. 'execvp()'에서 리턴 값을 테스트 할 필요가 없습니다. 그것은 실패 할 경우에만 리턴합니다. –

+1

아이가 어떻게 든 죽어 가고 싶지 않다면 대기 루프가 영원히 돌아 간다. 디버깅을 위해 프로세스 ID 및 상태를 캡처하고 인쇄하십시오. 견고성; 'int corpse;를 사용하십시오. int 상태; while ((시체 = 대기 (& 상태))! = -1 & 시체! = pid) printf ("자식 % d는 상태 0x.4X로 종료되었습니다 \ n", 시체, 상태); 이것조차 완벽하지는 않습니다. 그것은'errno == EINTR'으로'-e '를 처리하고'wait()'를 리턴 할 가능성을 무시한다. 최소한이 방법으로, 당신은 무슨 일이 일어나는지 알게 될 것입니다. –

+0

어떤 명령을 부릅니까? 'ls'를 호출하면, 이것이 반환되어야하는 것처럼 보입니다. 'cat'이나 stdin으로부터의 읽기를 막을 다른 것을 호출한다면, 여러분은 그것이 신호를 보낼 때까지 실행될 것이라고 기대할 것입니다. –

답변

-2

@Jonathan Leffler 내가 이것을 확인했는데 문제가 해결되지 않는다고 생각합니다. 나는 처음에 execute2를 호출 할 때 내가 원하는만큼 잘 작동한다고 제안하지만 그 프로 세 스를 끝내지는 않는다. 아니면 undestand something

+0

이 질문에 대한 답변을 제공하지 않습니다. [비슷한 질문을 검색 할 수 있습니다] (http://stackoverflow.com/search), 또는 페이지 오른쪽의 관련 및 연결된 질문을 참조하여 답변을 찾으십시오. 관련이 있지만 다른 질문이있는 경우 [새 질문하기] (// stackoverflow.com/questions/ask)를 읽고 컨텍스트를 제공하는 데 도움이되는 링크를 포함하십시오. 참조 : [질문하기, 대답하기, 산만하게하기] (http://stackoverflow.com/tour) – Krease

관련 문제