Задать вопрос
Ответы пользователя по тегу *nix-подобные системы
  • Синхронизация в Си или чем отличается вывод в файл от вывода в stdout

    @lesha_penguin
    1. Стандартный вывод никак не отличается от остальных файлов. Собственно, стандартным выводом может быть любой файл, терминал, пайп, сокет… и т.д. Это на уровне самой «оси».

    2. Но ваша «проблема» — не на уровне оси, а на уровне абстракции FILE* из «stdio.h». Ваша проблема это «проблема» буферизации ввода/вывода. Ввод/вывод который «stdio.h» он идет не напрямую, а через буфер. Который может быть «без буферизации» / «построчная буферизация» / «полная буферизация». И это не баг а фича, буферизация способна нехило увеличить производительность ввода вывода.
    Когда библиотека времени исполнения инициализирует stdin,stdout,stderr для дескрипторов 0,1,2 она смотрит на типы файлов (спрашивает у оси). И если это «терминал» то включает построчную буферизацию (т.е. системный вызов write() реально происходит когда заполняется строка до '\n'), а если «файл» то полную (т.е. пока буфер не заполнится его в файл не сбрасываем, либо по явному вызову fflush(sdtout);).

    3. Собственно, вам поможет явное выполнение:
    setlinebuf(stdout); // Включаем построчную буферизацию, как для терминала
    


    Все! Вы конечно, можете вообще выключить буферизацию, но этого не стоит делать.
    Ответ написан
    1 комментарий
  • Sendmsg с файловым дескриптором, открытым в обоих процессах?

    @lesha_penguin
    Посылать надо не в теле сообщения, а в auxiliary data через cmsg_level==SOL_SOCKET и cmsg_type==SCM_RIGHTS то результат будет аналогичный dup.

    Только для начала нужно разрешить передачу через setsockopt(fd,SOL_SOCKET,SO_PASSCRED,&enable,sizeof(enable));

    В общем man unix; man cmsg; man setsockopt
    Ответ написан
    1 комментарий
  • Сравнительная таблица кодов и расшифровок errno для различных юниксов?

    @lesha_penguin
    Если для того чтобы писать в логи, можете использовать более-менее штатные средства:
    1) Глобальную таблицу const char* sys_errlist[];
    2) Posix-рекомендуемую функцию strerror();
    3) Ну и наконец «быстро и просто» ругнуться в stderr можно с помощью perror()

    Понятно, что я вам счас сказал portable/compatible методы решения.
    Ответ написан
    1 комментарий