2016-12-29 7 views
3

Я хочу сделать процессы NO_PROC, чтобы каждый процесс читал сообщения от своего родителя, а затем записывал эти сообщения и еще одно сообщение своему дочернему элементу, за исключением случая последнего процесса, который пишет его сообщений до stdout. Таким образом, процесс i'th получит i-1 сообщения и отправит ребенку i сообщений. Я должен использовать канал для связи между процессами. Я написал код, но что-то не так, и я не могу найти ошибку: /. Когда NO_PROC = 5 Я хочу, чтобы результат выглядел как 4 строки с «моим сообщением», но на выходе у меня есть одна строка: «мое сообщение» и 3 пустые строки, например 3 сообщения - пустая строка: /. Примечание. err.h - это моя библиотека, которая дает мне функцию syserr(), когда что-то пошло не так.Отправка сообщений с использованием pipe - C

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include "err.h" 

#define NO_PROC 5 
#define BUF_SIZE 20 

char message[] = "my message"; 
int parent; 
char buf[BUF_SIZE]; 

int main() 
{ 
    for (int i = 0; i < NO_PROC; ++i) { 
     int pipe_dsc[2], buf_len; 
     if (pipe(pipe_dsc) == -1) 
      syserr("Error in pipe\n"); 
     pid_t pid = fork(); 
     if (pid == -1) 
      syserr("Error in fork\n"); 
     else if (pid == 0) 
      parent = pipe_dsc[0]; 
     else { 
      for (int j = 0; j < i; ++j) { 
       if ((buf_len = read(parent, buf, BUF_SIZE - 1)) == -1) 
        syserr("Error in read\n"); 
       buf[buf_len < BUF_SIZE - 1 ? buf_len : BUF_SIZE - 1] = '\0'; 
       if (i == NO_PROC - 1) 
        printf("%s\n", buf); 
       else if (write(pipe_dsc[1], buf, sizeof(buf)) != sizeof(buf)) 
        syserr("Error in write\n"); 
      } 
      if (i < NO_PROC - 1 && write(pipe_dsc[1], message, sizeof(message)) != sizeof(message)) 
       syserr("Error in write\n"); 
      if (wait(0) == -1) 
       syserr("Error in wait\n"); 
      return 0; 
     } 
    } 
} 
+1

«что-то не в порядке». Пожалуйста, будьте более конкретными. Например, пожалуйста, сообщите нам точный ожидаемый результат и фактический результат. – kaylum

+0

Извините, я полностью забыл об этом. Итак, когда NO_PROC = 5, я хочу, чтобы результат выглядел так: – Niko

+1

Пожалуйста, добавьте информацию в вопрос. Не как комментарии. – kaylum

ответ

1

Я думаю, что вы слишком усложняете и/или используете неправильный подход. Вам не нужно отправлять i сообщениям на ith процесс. Поскольку процесс ith является копией (fork) процесса i-1th, он уже получил сообщение i-1 и просто нуждается в еще одном. Это довольно симметричная (и академическая) проблема.

Ниже приведен пример (), надежная проверка ошибок опущена). Обратите внимание, это зависит от пишет атомная труба, которая хорошо до тех пор, пока вы не пишете сообщение более, что PIPE_BUF (см man pipe):

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

void syserr(char * msg) { printf("%s\n", msg); exit(1); } 
#define NO_PROC 5 
#define BUF_SIZE 100 
char message[] = "my message "; 

int main() { 
    int message_len = 0; 
    char buf[BUF_SIZE]; 
    for (int i = 0; i < NO_PROC; ++i) { 
     int pipe_dsc[2], buf_len; 
     if (pipe(pipe_dsc) == -1) { 
      syserr("Error in pipe\n"); 
     } 
     pid_t pid = fork(); 
     if (pid == -1) { 
      syserr("Error in fork\n"); 
     } 
     else if (pid == 0) { 
      close(pipe_dsc[1]); 
      int n = read(pipe_dsc[0], buf+message_len, sizeof(buf)); 
      message_len = strlen(buf); // Assume message is null terminated string. 
      if(i == NO_PROC -1) { 
       printf("Process %i: received '%s'\n", i+1, buf); 
      } 
     } 
     else { 
      close(pipe_dsc[0]); 
      write(pipe_dsc[1], message, sizeof(message)); 
      wait(0); 
      return 0; 
     } 
    } 
} 
+1

Заслуживает большой +1, чтобы понять вопрос (но у вас есть много предупреждений: p). Ну, я не хотел раздражать это, но @JonathanLeffler это делает ... – Stargateur

+1

Это утечка большого количества файловых дескрипторов. Неважно, действительно ли это - отдельный вопрос; в этом контексте, может быть, и нет, но в целом вам нужно быть менее осторожным по поводу утечки труб. В частности, процессы могут не заканчиваться должным образом, если им необходимо обнаружить EOF на трубах, и слишком много процессов имеют тот же канал, открытый для записи (и/или чтения). –

+0

@JonathanLeffler определенно стоит отметить для OP, но я воспринял это как академический вопрос, так как разветвленные процессы действительно не делают никакой реальной полезной работы, и я не мог понять, какую реальную полезную работу они могут намереваться сделать в таких состав. – spinkus

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

  • Нет связанных вопросов^_^