2016-11-23 5 views
-1

Я использую linux \ unix os. Когда я побежал ниже кода, я получаю 2 выхода. Упомянутый ниже:Получение 2 выходов для одного и того же кода

а) 12345- б) 1-2-3-4-5-

Может кто-нибудь, дайте мне знать, как и почему выше 2 выхода поступают?

int main() 
{ 
int i, n, pfds[2]; 
char c, buf[80]; 

pipe(pfds); 
if (fork() == 0) 
{ 
    for (c='1'; c<='5'; c++) 
    write(pfds[1], &c, 1); 
} 
else 
{ 
    close(pfds[1]); 
    while ((n = read(pfds[0], buf, sizeof(buf))) > 0) 
    { 
    write(1, buf, n); 
    write(1, "-", 1); 
    } 
} 
return 0; 
} 

ответ

0

Linux буферизует вашу запись в трубу, и в какой-то момент она очищает буфер, а считываемая вилка читает все за один раз. Вы должны иметь возможность изменить это, выполнив fflush() после записи.

+0

fflush влияет только на буфер stdio (fwrite и другие), которые он не использует. – 12431234123412341234123

0

Почему вы используете массив символов для печати только одного символа? Не используйте буфер stdio для печати символа.

Я изменил вашу декларацию формы char buf [80] на buf.

while ((n = read(pfds[0], &buf, 1)) > 0) 
{ 
write(1, &buf, n); 
write(1, "-", 1); 
} 
0

Труба - это поток. Это означает, что вы получите на одном конце все символы, отправленные из другого и в том же порядке. Но пакеты не сохраняются. Условия гонки позволяют читать, чтобы получить все или только один символ за один раз, или everythin между ними ...

Если вы хотите обработать на гольца в то время (и получить 1-2-3-4-5-)

while ((n = read(pfds[0], buf, 1)) > 0) 
{ 
write(1, buf, n); 
write(1, "-", 1); 
} 

Если вы предпочитаете, чтобы обработать все на целом (и получить 12345-):

int tot = 0 
while ((n = read(pfds[0], buf+tot, sizeof(buf)-tot)) > 0) tot += n; /* gather everything */ 
write(1, buf, tot); 
write(1, "-", 1); 
0

При вызове чтения(), функция не будет читать так много символов, имеющихся в наличии, пока больше нет слева или нажмите счет.

Когда вы запустите его с sizeof (buf), вы можете читать 1,2..5 символов, если в трубе было 5 шаров, как в вашем прогоне, вы читаете все символы, выдает «-», и следующий read return 0, потому что канал пуст, и никто больше не пишет ему.

Если в трубе есть только 1 символ, как и в вашем b run, тогда вы читаете только один символ, выведите «-», а затем прочитайте и дождитесь, пока ребенок больше напишет в буфер. То, что есть только один, - это то, что ребенок был запланирован после записи одного символа.

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