Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

freebsd, перенаправление вывода

287
11 мая 2009 года
Shiizoo
958 / / 14.03.2004
Пока писал сырцы для реферата по сокетам столкнулся со следующей штуковиной — при использовании трубы с моим приложением, очередность вывода основного и дочернего процесса меняется. Причин думать, что должно быть по-другому нет, но интересно, почему все именно так.

Прога тривиальная - один процесс порождает другой и оба они строго поочередно пишут в stdout по строке за раз. При запуске в лоб из shell вывод на экран идет именно таким образом: родитель, потомок, родитель, потомок, .... При перенаправлении вывода "./1 | pipe" или "./1 > ./out" сначала выводит всё-всё-всё родитель, затем потомок. Причем при многократном запуске можно заметить, что отбалды случается, что иногда потомок раньше своё всё-всё-всё выводит, чем предок, хотя это вопреки логике программы. Попробовал разные шеллы — один результат.

То что все скопом выводится наводит на мысль о каких-то хитрых блокировках. А то, что потомок иногда раньше выводит, на мысль о хитрой буферизацией. Ну, может, не хитрой, а просто мне неизвестной. =)ъ

Код:
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>

int main() {
  system(“clear”);
  int socks[2];
  if (socketpair(AF_UNIX, SOCK_STREAM, 0, socks) == -1) {
    perror(“opening socket pair”);
    exit(1);
  }
  Int child
  If ((child = fork()) == -1) {
    perror(“forking process”);
    exit(-1);
  }
  int state, sock;
  char *pname;
  if (child) {
    state = 0;
    pname = “parent”;
    sock = socks[0];
  } else {
    state = 1;
    pname = “child”;
    sock = socks[1];
  }
  char msg[15]; int i = 0, o = 0;
  while (i < 5 || o < 5) {
    if (!state) {
      sprint(msg, “message no. %d”, o);
      send(sock, msg, strlen(msg) + 1, 0);
      ++o;
    } else {
      recv(sock, msg, 15, 0);
      printf(“%s: message received: \”%s\”\n”, pname, msg);
      ++i;
    }
    state = state ? 0 : 1;
  }
  return 0;
}
287
13 мая 2009 года
Shiizoo
958 / / 14.03.2004
Хых. А я уже взялся исходники csh изучать. Спасибо, интересная ссылка. С fflush() ведет себя как ожидалось, или почти как ожидалось. Нашел себе кучу презентаций и доков про трубы и т. п., буду разбираться. А то с виду все просто, а на деле вот такие нюансы вылезают. =)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог