a escrita do fifo não está bloqueada [fechada]

0

Eu tenho um programa simples

int main () {
  int fd;
  int i, rc;
  i = 0;

  rc = mkfifo ("fff", 0);
  fd = open ("fff", O_WRONLY);
  fprintf(stdout,"open fifo fff succeeded\n"); fflush (stdout);
  while (i<8)
  {
    rc = write (fd, "abcdefg", 8);
    fprintf(stdout,"write to 'fff' returned with rc=%d\n",rc); fflush (stdout);
    i++;
  }
  close (fd);
  return 0;
}

Eu o executo no Unbuntu 16.04, Linux myserv 4.4.0-81-genérico # 104-Ubuntu SMP, e eu tenho o seguinte:

open fifo fff succeeded 
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1

Ele mostra que os arquivos abertos e gravados não são bloqueados sem nenhum processo aberto para leitura. De acordo com a página de manual do Linux,

. . . However, it has to be open at both ends simultaneously before you can proceed to do any input or output operations on it. Opening a FIFO for reading normally blocks until some other process opens the same FIFO for writing, and vice versa.

Parece que eu tenho uma contradição. Existe alguma coisa que eu perdi? Espere uma explicação sobre isso. Além disso, alguma sugestão para implementar "gravação bloqueada" para um FIFO?

    
por user693986 01.10.2017 / 08:14

1 resposta

5

Regra # 1: Leia a man page para tudo que você faz. Regra # 2: Em caso de dúvida, faça ls -la .
Regra nº 3: ao depurar um programa, imprima todas as variáveis.
Regra # 3a: não anunciar que algo foi bem sucedido sem primeiro verificar se realmente foi bem sucedido.

O segundo argumento para mkfifo é o modo . Você está criando um modo FIFO com (permissões) 0; ou seja, p--------- . Portanto, o open está falhando com um erro EACCESS e retornando -1 para fd . E gravar em um descritor de arquivo -1 está falhando com um erro EINVAL.

    
por 01.10.2017 / 08:28

Tags