2016-12-06 4 views
0

Я написал эту программу, которая взяла N количество аргументов и отправила их от первого дочернего процесса до последнего. Второй ребенок добавляет 20% к полученной им стоимости, а третий ребенок добавляет 30%.

Проблема в том, что первый ребенок всегда отправляет только первый аргумент. Я не могу найти ошибку. Может ли кто-нибудь помочь мне решить эту проблему? Вот пример вывода:Трубная связь между 4-мя детьми процессами работает только в первый раз

./prodajnaVerigaAnon 200 100 50 
312 312 312 

Это должно быть: 312 156 78.
Вот код:

for(int i=1;i<argc;i++) { 
    char init_price[size]; 
    const int len = sprintf(init_price,"%d",atoi(argv[i])); 
    write(fd1[1], init_price, (size_t) len + 1); 
} 
close(fd1[1]); 
_exit(0); 

EDIT: Я удалил большую часть кода, потому что это было назначение школы.

ответ

0

проблема,

write(fd1[1], init_price, (size_t) len + 1); 

функция записи отправить 200 через трубы fd1 [1], но ни один читатель не был доступен, поэтому труба не получила шанс избавиться, еще 200 существует в трубе. , чтобы ваша труба не могла получить больше ввода.

когда

read(fd1[0], readbuffer, sizeof(readbuffer)); 

доступны, он находит только 200 в трубе так, только для чтения этого значения.

Если вы хотите увидеть изменение, а затем положить сон, вы увидите, что читатель может читать и другие данные. потому что сон помогает процессу чтения switch.so контекста будет доступен для прослушивания на трубе.

for(i=1;i<argc;i++) 
{ 
    char init_price[size]; 
    const int len = sprintf(init_price,"%d",atoi(argv[i])); 
    write(fd1[1], init_price, (size_t) len + 1); 
    sleep(2); 
} 
close(fd1[1]); 
_exit(0); 
0

Трубы - это поток данных. Количество чтений не обязательно равно количеству записей.

Что происходит в этом случае, так это то, что первый ребенок выполняет три записи в трубе, а второй ребенок считывает все три значения в одном чтении. Вы не проверяете возвращаемое значение read, чтобы узнать, сколько байтов было прочитано.

После вызова read проверьте возвращаемое значение, чтобы узнать, сколько байтов было прочитано. Затем используйте strtol вместо atoi для преобразования значения. Первый позволяет вам передать указатель, который по возвращении укажет на то место в буфере, где преобразование остановилось. Затем вы можете продолжить чтение, пока буфер не будет исчерпан, а затем снова вызовите read.

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

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