2015-11-18 3 views
2

Я хочу, чтобы 2 дочерних процесса поместили их имена и подождали, пока другой процесс не поместит его имя. Например, если есть первый и второй процесс, он сначала поместит свое имя и будет ожидать другого имени на экране. Я хочу работать с процессами, и я хочу видеть, что они работают последовательно.c труба, как процессы работают последовательно

Выход:

first 
second 
first 
second 
first 
second 

Я просто пытался что-то о C (Linux).

int main(void) 
{  
    pid_t child_a, child_b; 
    int pipe1[2], pipe2[2]; 
    char mesazhi1[] = "first"; 
    char mesazhi2[] = "second"; 

    char buf[1024]; 

    int first_pipe = pipe(pipe1); 
    pipe(pipe2); 

    if(first_pipe == -1){ 
     perror("pipe"); 
     exit(1); 
    } 

    child_a = fork(); 

    if (child_a == 0) 
    { 
     /* Child A code */ 
     int i; 
     for (i = 0; i < 3; i++) 
     { 
      write(pipe1[1],mesazhi1, strlen(mesazhi1) + 1); 
      //printf("first\n"); 
      int a = read(pipe2[0], buf, strlen(mesazhi2) + 1); 
      printf("%s - %d\n", buf, a); 
     } 

    } 
    else 
    { 
     child_b = fork(); 

     if (child_b == 0) 
     { 

      int i; 
      for (i = 0; i < 3; i++) 
      { 
       write(pipe2[1],mesazhi2, strlen(mesazhi2) + 1); 
       //printf("second\n"); 
       int a = read(pipe1[0], buf, strlen(mesazhi1) + 1); 
       printf("%s - %d\n", buf, a); 
      } 

     } 
     else 
     { 
      /* Parent Code */ 

      int returnStatusA,returnStatusB;  
      waitpid(child_a, &returnStatusA, 0); // Parent process waits here for child to terminate. 
      waitpid(child_b, &returnStatusB, 0); // Parent process waits here for child to terminate. 


      if (returnStatusA == 0 && returnStatusB == 0) // Verify child process terminated without error. 
      { 
       printf("%s\n", "The child processes terminated normally.\n"); 
      } 

      if (returnStatusA == 1 && returnStatusB == 1)  
      { 
       printf("%s\n", "The child processes terminated with an error!. \n");  
      } 




     } 
    } 
} 

Он ставит имя случайно. Я имею в виду, что я думаю, иногда второй процесс работает быстрее, чем первый. Выход так:

first 
second 
second 
first 
second 
... 

SO почему второй процесс не ждать первого, потому что я думаю, что функция чтения() следует подождать, пока не будет что-то в Pipe1.

+3

Возможно, вы захотите подумать о последствиях ** параллельного выполнения **. Найдите «синхронизацию процесса». Кстати: каков был ваш вопрос? – Olaf

+4

Это не ваш настоящий выход. Я знаю, потому что ваша программа также печатает значение 'a'. Отправьте свой реальный результат (или его короткую часть) ... – immibis

ответ

1

В опубликованном коде оба процесса записывают в соответствующие каналы, а затем читают. После этого, это гонка, чтобы увидеть, какой процесс печатает в первую очередь.

Для более контролируемой ситуации, иметь ребенка B вызов read и printfперед призывающую write. Таким образом, B должен ждать A перед печатью, и наоборот.

if (child_b == 0) 
{ 
    int i; 
    for (i = 0; i < 3; i++) 
    { 
     int a = read(pipe1[0], buf, strlen(mesazhi1) + 1); 
     printf("%s - %d\n", buf, a); 
     write(pipe2[1],mesazhi2, strlen(mesazhi2) + 1); 
    } 
} 
+0

Точно. Я выяснил это вчера, но я принимаю ваше решение. Спасибо чувак. –

+0

@ AlihanAvcı Добро пожаловать, в следующий раз я постараюсь быть быстрее :) – user3386109

Смежные вопросы