2015-02-05 4 views
2

할당을 위해 총 4 개의 프로세스를 만들고 각 프로세스마다 문자를 여러 개 인쇄해야합니다. 이 일을 위해 fork() 번을 두 번 호출해야합니다.C 코드를 실행하기 전에 fork()에서 여러 프로세스 ID를 출력

각 프로세스마다 문자를 여러 번 인쇄 할 수있었습니다. 문제는 할당 세부 사항의 두 번째 부분에서 발생합니다. 글자를 출력하기 전에 각 프로세스의 프로세스 ID를 출력해야합니다. 출력은 다음과 같아야합니다

Process ID: 123 
Process ID: 124 
Process ID: 125 
Process ID: 126 
AAAAABBBBBCCCCCDDDDD 

내가이이 코드를 사용하여 수행 할 수 있다고 생각 : 나는 라인 child1 = fork()에서 fork() 분할 이후 생각

pid_t child1, child2; 
child1 = fork(); 
child2 = fork(); 

printf("Process created. ID: %d\n", getpid()); 

if(child1 == 0) { // print letters } 
else if(child2 == 0) { //print letters } 
else { // call waitpid and print more letters } 

을 다음 child2 = fork() 다시 분할 한 다음에 간다 다음 줄이면 모든 것을 인쇄하고 if-else 문장을 누르십시오. 그러나 이것은 다음과 같습니다.

Process created. ID: 20105 
Process created. ID: 20107 
AAProcess created. ID: 20106 
AAABBBProcess created. ID: 20108 
BBCCCCCDDDDD 

프로세스 생성 인쇄 문이 맨 처음 실행되도록하려면 어떻게해야합니까?

+0

'child1 = fork(); child2 = fork();'내가 틀렸다면 이것은 자식 프로세스를 자식 내에서 생성 할 것입니다 .. 당신이 원하는 것이 아니라고 믿습니다. –

+0

print id 문 뒤에 지연을 추가하려고 시도 했습니까? ['sleep'] (http://man7.org/linux/man-pages/man3/sleep.3.html)과 같이 ID가 인쇄 된 후 인쇄 문자가 인쇄됩니다. – SSC

+0

@SCC 지연은 Alex가 fork()를 잘 구조 할 필요가 있다고 생각하지 않을 것입니다. –

답변

-1

여기에 동기화 문제가 있습니다. 여러 프로세스가 단일 리소스 (stdout)를 공유하며 인쇄하려고합니다. 여기에는 리소스의 주 프로세스 관리자를 만들고 자식 프로세스가 원하는 출력을 보내도록합니다 (예를 들어, pipes, this 답을 사용하면 응답에서 힌트를 얻을 수 있음) 또는 동기화를 사용해야합니다 semaphores (here은 매우 좋은 예입니다).

+0

다른 프로세스의 호출을'fork()'와'wait()'와 적절하게 결합/"동기화"함으로써'printf()'호출을 순차 화하는 세 번째 옵션을 놓칩니다. – alk

+0

일반적으로 'wait()'를 사용하는 것이 좋은 생각입니다. 어떤 경우에는 해결책이 될 수 있지만 여기서는 4 개의 프로세스를 동기화해야하기 때문에 세마포어를 사용하는 것과 비교하여 'wait() '에 대한 올바른 값을 얻기 위해 많은 노력을 기울여야합니다. – iwlagn

0
child1 = fork(); // Fork 1 here 
child2 = fork(); // Fork 2 here after first fork .!! 

위의 포크는 네 개의 프로세스를 생성합니다. 그러나 원래 부모와 첫 번째 자녀가있는 두 번째 fork()을하고 있습니다. 나는 이것이 당신이 정말로해야 할 일이 아니라고 생각합니다. 원본 부모만으로 세 가지 프로세스를 시작해야합니다.

주어진 예제를보십시오. 여기에 2 개의 하위 프로세스를 만들고 모든 프로세스 수는 3입니다 [Main]. 여기서 필자는 필요한 출력을 제공하는 참조 솔루션을 제공하려고 노력했습니다.

#include <unistd.h>  /* Symbolic Constants */ 
#include <sys/types.h> /* Primitive System Data Types */ 
#include <stdio.h>  /* Input/Output */ 
#include <sys/wait.h> /* Wait for Process Termination */ 
#include <stdlib.h>  /* General Utilities */ 

int main() 
{ 
    pid_t childpid1,childpid2; /* variable to store the child's pid */ 

    /* now create new process */ 
    childpid1 = fork(); 

    if (childpid1 >= 0) /* fork succeeded */ 
    { 
     if (childpid1 == 0) /* fork() returns 0 to the child process */ 
     { 
      printf("1 : %d \n",getpid()); 

      printf("AA");  
     } 
     else /* fork() returns new pid to the parent process */ 
     { 
      childpid2 = fork(); 
      if (childpid2 >= 0) /* fork succeeded */ 
      { 
        if (childpid2 == 0) /* fork() returns 0 to the child process */ 
        { 
        printf("2 :%d \n",getpid()); 

        int stat; 
        waitpid(childpid1, &stat, 0); 

        printf("BB");  
        } 
        else /* fork() returns new pid to the parent process */ 
        { 
        printf("3 : %d \n",getpid()); // This is the Original parent of ALL 

        int stat2; 
        waitpid(childpid2, &stat2, 0); 

        printf("CC");    
        } 
      } 
     } 
    } 

    return 0; 
} 
+1

불행하게도 이것은 부모 ID 인 child1 ID를 인쇄하고 "AA"를 인쇄 한 다음 자식 2 ID를 인쇄 한 다음 "BB"를 인쇄 한 다음 자식 3 ID를 인쇄하고 "CC"를 인쇄합니다. AA, BB 및 CC 출력 전에 첫 번째 인쇄 명령문이 시작될 때까지 기다리십시오. – Alex

관련 문제