2015-03-27 2 views
0

Мы пытаемся читать данные char * из канала, переданного нескольким дочерним процессам.
каждый ребенок записывает char * в общий канал, из которого читается родительский процесс.
Мы пытаемся проанализировать информацию о дочерних процессах, запущенных в xv6.
при разборе одного процесса у нас нет никаких проблем, но при анализе процесса трубы, который имеет рекурсивный вызов «runcmd», возникает следующая проблема:
мы использовали следующий код в конце родителя:чтение из нескольких писем с несколькими каналами

while(read(p[0],buff,sizeof(buff)) > 0){ 
    printf(1,"\nprocess from pipe in main: "); 
    printf(1,buff); 
    printf(1,"\n"); 
} 

и у детей заканчивается:

char * name = ecmd->argv[0]; 
char * data=(char*)malloc(strlen(name)*sizeof(char)+strlen(pidc2)*sizeof(char)+3); 
strcpy(data,name); 
char* delimiter="#"; 
strcpy(data+strlen(name),delimiter); 
strcpy(data+strlen(name)+strlen(delimiter),pidc2); 
strcpy(data+strlen(name)+strlen(delimiter)+strlen(pidc2),"\0"); 
write(pp[1],data,sizeof(char)*(strlen(data))); 

, когда мы запустим этот код с "LS | кот", он будет печатать:

ls#*some_pid*cat#*some_pid* 

вместо чтения из каждого ребенка и печать

ls#*some_pid* 
cat#*some_pid* 

почему не будет ли он отправить их по отдельности?

+0

Непонятно, что вы просите. Ваш дочерний код не показывает код трубы - очень запутанный. Какая большая картина? Вы хотите достичь? – DrKoch

+0

Что произойдет, если вы замените '' \ 0 "' на '' \ n "'? –

ответ

0

Потому что это как раз то, как работают трубы. Внутри операционная система объединяет данные всех авторов в один поток. Как следует из высказанных замечаний, каждый писатель может вставить какой-то разделитель записей ('\ 0' или '\ n'), а затем процесс чтения ищет и разделяет запись на разделителях.

Я не знаю о xv6 конкретно, но традиционно unix-подобные системы гарантировали (и на самом деле это требование posix.1), что запись любого сообщения ниже определенной указанной длины будет атомарной (т. Е. Если два процесса записывают «foo», читатель увидит «foo foo» не «ffooo o» или любую другую перестановку).