anonymous@RULINUX.NET~# Last login: 2022-09-26 17:53:00
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

Вопрос по потокам

Дано:

#include <stdio.h> int main(void) { printf("start "); if (!fork()) printf("parent "); else printf("child "); }

Я правильно понимаю, что разница между ./prog и ./prog | cat обусловлена тем, что у stdout буфера нету, а у pipe'ов он есть?

anonymous(*) (2009-07-09 02:29:57)

Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.11) Gecko/2009062714 Gentoo Firefox/3.0.11

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: Вопрос по потокам от anonymous 2009-07-09 02:29:57
avatar
Скрыть

Re:Вопрос по потокам

> if (!fork()) printf("parent ");

man fork | grep "0 is returned in the child"

anonymous(*)(2009-07-09 03:06:17)

Mozilla/5.0 (compatible; Konqueror/4.2; Linux) KHTML/4.2.2 (like Gecko) Fedora/4.2.2-12.fc11
[#] [Добавить метку] [Редактировать] Ответ на: Вопрос по потокам от anonymous 2009-07-09 02:29:57
avatar
Скрыть

Re:Вопрос по потокам

Да-да, верно

А по теме, похоже, что терминал чистит буфер после каждого

Vitel(*)(2009-07-09 03:19:01)

Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.11) Gecko/2009062714 Gentoo Firefox/3.0.11
[#] [Добавить метку] [Редактировать] Ответ на: Вопрос по потокам от anonymous 2009-07-09 02:29:57
avatar
Скрыть

Re:Вопрос по потокам

Ты результат бы написал - что получается. Теряется вывод дочернего потока потому что родительраньше завершился или что?

anonymous(*)(2009-07-09 03:31:40)

Mozilla/5.0 (compatible; Konqueror/4.2; Linux) KHTML/4.2.2 (like Gecko) Fedora/4.2.2-12.fc11
[#] [Добавить метку] [Редактировать] Ответ на: Вопрос по потокам от anonymous 2009-07-09 02:29:57
avatar
Скрыть

Re:Вопрос по потокам

./prog:

start child parent

./prog | cat:

start parent start child

Vitel(*)(2009-07-09 09:50:08)

Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.11) Gecko/2009062714 Gentoo Firefox/3.0.11
[#] [Добавить метку] [Редактировать] Ответ на: Вопрос по потокам от anonymous 2009-07-09 02:29:57
avatar
Скрыть

Re:Вопрос по потокам

терминал ничего не чистит. Просто при выводе в консоль по умолчанию ставится нулевой буфер. Дочерний же процесс наследует этот буфер и копирует к себе со всем содержимым при записи в него.

Включи буферизацию stdout и результат будет везде одинаков:

  1.  #include <stdio.h>
  2.  int main(void) {
  3.   char c[2049];
  4.   setbuf(stdout,c);
  5.   printf("start ");
  6.   if (!fork()) printf("Child ");
  7.   else {
  8.   printf("Parent ");
  9.   sleep(1);
  10.   };
  11.  }
  12.  

anonymous(*)(2009-07-09 15:53:50)

[#] [Добавить метку] [Редактировать] Ответ на: Вопрос по потокам от anonymous 2009-07-09 02:29:57
avatar
Скрыть

Re:Вопрос по потокам

надо то чего ? для сброса буферизации есть fflush(stdout). или тебя волнует что child начинает работать быстрее parent ? а кто обещал обратное ? нужно гарантировать чтобы child работал позже - используй какую либо синхронизацию. к примеру на pipe или еще на чем либо.

progman(*)(2009-07-10 10:41:38)

Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.10 (like Gecko) (Debian)
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!