Flock на FIFO файл (named pipe) работает во всех Unix-ах или только в Linux?

Flock на FIFO файл (named pipe) работает во всех Unix-ах или только в Linux?

12.08.2013 01:54:33 Просмотров 26 Источник

Сейчас мне доступны только RHEL и xubuntu (debian) и внятно сформулировать вопрос в гугле не удалось.

Интересует поведение системных (м.б. libc в завоисимости о ОС) вызовов

int fd = open(FIFOFILE, O_RDWR | O_CLOEXEC);
if (flock(fd, LOCK_EX | LOCK_NB) 
  if (errno == EWOULDBLOCK)
    fatal("another reader detected");
  else
    fatal("flock");

для разных ОС. В линуксе все предсказуемо блокируется и блок не сбрасывается при вызове, например, system().

Можно ли рассчитывать на такое же поведение в других *nix-ах?

По совету @KoVadim написал пример (надеюсь рабочий, т.к. кроме Линукса проверить негде)

// flfifo.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

#define FIFOFILE "./fifo.fifo"
#define fatal(msg) (printf("%s: %m\n", (msg)), av[1]? 1: unlink(FIFOFILE), exit(-1))

int 
main (int ac, char *av[])
{
  mkfifo(FIFOFILE, 0666);
  int fifo = open(FIFOFILE, O_RDWR | O_CLOEXEC);
  char buf[1024];

#if 0  // заменить на 1 для теста FAIL в Linux
  if (lockf(fifo, F_TLOCK, 0)) {
    if (errno == EAGAIN)
#else
  if (flock(fifo, LOCK_EX | LOCK_NB)) { // так не теряем lock вызывая system
    if (errno == EWOULDBLOCK)
#endif
      fatal("another reader detected");
    fatal("flock");
  }

  if (av[1])
    fatal("no work");

  close(dup(fifo));
  sprintf (buf, "%s test", av[0]);
  FILE *proc = popen(buf, "r");
  fgets(buf, 1024, proc);
  printf ("answer: %s\n", buf);
  pclose(proc);
  if (strncmp(buf, "another", 7) == 0)
    puts("OK");
  else
    puts("FAIL");

  unlink(FIFOFILE);
  return 0;
}

Пример запуска

avp@avp-xub11:~/src/dispro/BM$ gcc flfifo.c 
avp@avp-xub11:~/src/dispro/BM$ ./a.out 
answer: another reader detected: Resource temporarily unavailable

OK
avp@avp-xub11:~/src/dispro/BM$
У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/243790/flock-%d0%bd%d0%b0-fifo-%d1%84%d0%b0%d0%b9%d0%bb-named-pipe-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-%d0%b2%d0%be-%d0%b2%d1%81%d0%b5%d1%85-unix-%d0%b0%d1%85-%d0%b8%d0%bb%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%b2-linux#comment243799_243790
Создайте минимальный, но полный пример, тогда большинство пользователей смогут скомпилировать у себя и проверить. Желательно, что бы программа выводил "все ок" или "ой, ужас, не работает".

Ответы - Flock на FIFO файл (named pipe) работает во всех Unix-ах или только в Linux? / Flock на FIFO файл (named pipe) работает во всех Unix-ах или только в Linux?

lsillarionov

07.09.2013 12:20:38

На FreeBSD LOCK_EX не поддерживается на спец. файлах. flock() из примера завершается с EOPNOTSUPP, а не EWOULDBLOCK.

https://ru.stackoverflow.com/questions/243790/flock-%d0%bd%d0%b0-fifo-%d1%84%d0%b0%d0%b9%d0%bb-named-pipe-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-%d0%b2%d0%be-%d0%b2%d1%81%d0%b5%d1%85-unix-%d0%b0%d1%85-%d0%b8%d0%bb%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%b2-linux/250940#comment250943_250940
Большое спасибо! А соляриса у Вас под рукой нет?
https://ru.stackoverflow.com/questions/243790/flock-%d0%bd%d0%b0-fifo-%d1%84%d0%b0%d0%b9%d0%bb-named-pipe-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-%d0%b2%d0%be-%d0%b2%d1%81%d0%b5%d1%85-unix-%d0%b0%d1%85-%d0%b8%d0%bb%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%b2-linux/250940#comment250955_250940
@avp, Solaris и OpenSolaris прекрасно ставятся в VirtualBox.
https://ru.stackoverflow.com/questions/243790/flock-%d0%bd%d0%b0-fifo-%d1%84%d0%b0%d0%b9%d0%bb-named-pipe-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d0%b5%d1%82-%d0%b2%d0%be-%d0%b2%d1%81%d0%b5%d1%85-unix-%d0%b0%d1%85-%d0%b8%d0%bb%d0%b8-%d1%82%d0%be%d0%bb%d1%8c%d0%ba%d0%be-%d0%b2-linux/250940#comment250959_250940
@mikillskegg, спасибо, но задача для других (кроме Linux) ОС не настолько актуальна, чтобы так с ней возиться. Просто когда спрашивал, думал, что у народа много чего под рукой есть. Скопипастил, сказал gcc t.c; ./a.out и всех делов... -- Кстати, на AIX работает, но у этих заказчиков только RHEL.
Закрыть X