2010-03-13 9 views
3

부모 프로세스는 인수를 main()에 전달하고 파이프를 통해 자식 프로세스에 한 번에 하나씩 문자를 보냅니다. 쓰기). 자식 프로세스는 부모 프로세스가 보낸 문자 수를 계산하고 부모로부터받은 문자 수를 출력합니다. 자식 프로세스는 어떤 식 으로든 main()에 대한 인수를 사용하면 안됩니다. 아이는 정상적으로 돌아가고 부모는 아이를 죽이지 않아야합니다.부모 프로세스 및 자식 프로세스

나는 논증을 오른쪽으로 계산합니까? 나는 한 번에 하나씩 논쟁을 보내고, 나는 그 아이를 거두고 있습니까?

#include <sys/wait.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#define size = 100; 

int main(int argc, char *argv[]) 
{ 

    int i, count =0; 
    int c; 

    int  fdest[2];   // for pipe 
    pid_t pid;    //process IDs 
    char buffer[BUFSIZ]; 



    if (pipe(fdest) < 0)   /* attempt to create pipe */ 
     perror("pipe"); 

    if ((pid = fork()) < 0) /* attempt to create child/parent process */ 

    { 
     perror("fork"); 
    } 


    /* parent process */ 
    else if (pid > 0) { 

     close(fdest[0]); 
     for (i=1; i < argc; ++i) 
     { 
      for (c=0; c < strlen(argv[i]); ++c) { 
       write(fdest[1], &argv[i][c], 1); 
      } 
     } 

     close(fdest[1]);   
     wait(NULL);    
     exit(0); 

    } else { 

     /* child Process */ 
     close(fdest[1]); 

     while (read(fdest[0], &buffer, 1) > 0) 
     { 
      count++; 
     } 


     printf("\nchild: counted %d characters\n", count); 

    } 
    wait(NULL); 
    exit(0); 

} 
+5

이전에이 질문을 게시 한 것으로 보입니다. 아마도 당신은 이전 질문과 다른 점을 설명 할 수 있습니다 : http://stackoverflow.com/questions/2390868/passing-command-line-arguments-to-a-child-process-and-count-them –

+0

메인 차이점은 한 번에 한 글자 씩 파이프에 쓰고 한 번에 한 글자 씩 파이프에서 읽는 것에 대한 엄격한 것 같다. –

+0

숙제 태그가 필요합니까? –

답변

2

두 번째 wait()는 불필요합니다. 그 아이는 자신 만의 자식이 없기를 기다린다. 두 번째 'exit (0);' 'return (0);'으로 바꿀 수 있습니다. 이전 'exit (0);'을 생략 할 수 있습니다. 너무.

'#define size = 100;'은 사용되지 않습니다. '='을 사용하면 대부분의 용도에서 사용할 수 없으므로 (또한 세미콜론도 나쁜 생각이므로 거의 세미콜론으로 끝납니다) . '#define size 100'또는 'enum { size = 100 };'이어야합니다. 종종 '매니페스트 상수'에 대문자 이름을 사용하므로 'enum { SIZE = 100 };'입니다.

한 번에 한 문자 씩 읽는 경우 BUFSIZ (일반적으로 512 이상) 크기의 버퍼가 필요하지 않습니다.

또한 각 반복에서 문자열의 길이를 계산하기 때문에 'for (c = 0; c < strlen(argv[c]); c++)'을 실행하는 것은 좋지 않은 생각입니다.

for (const char *str = argv[i]; *str != '\0'; str++) 
    write(fdest, str, 1); 

for (c = 0, len = strlen(argv[i]); c < len; c++) 
     write(fdest[1], &argv[i][c], 1); 

파이프의 사용되지 않는 끝 부분을 닫습니다. 즉, 올바르게 작동시키는 데 중요한 단계입니다.

코드가 올바르게 계산되고있는 것 같습니다. 테스트 할 때 선반에서 작동합니다. 왜 작동하지 않는지 당신이 의심 스럽습니까?