next up previous
Next: Manipulação das FIFOs Up: Criação de um tubo Previous: Criação de um tubo

Primitiva mknod()

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>
       #include <unistd.h>

       int mknod(const char *pathname, mode_t mode, dev_t dev)

Valor de retorno: 0 se a criação do tubo tem sucesso, e -1 caso contrário.

A primitiva mknod() permite a criação de um nó (arquivo normal ou especial, ou ainda um tubo) cujo nome é apontado por pathname, especificado por mode e dev. O argumento mode especifica os direitos de acesso e o tipo de nó a ser criado. O argumento dev não é usado na criação de tubos com nome, devendo ter seu valor igual a 0 neste caso.

A criação de um tubo com nome é o único caso onde o usuário normal tem o direito de utilizar esta primitiva, reservada habitualmente ao super-usuário. Afim de que a chamada mknod() tenha sucesso, é indispensável que o flag S_IFIFO esteja ''setado'' e nos parâmetros de mode os direitos de acesso ao arquivo estejam indicados: isto vai indicar ao sistema que uma FIFO vai ser criada e ainda que o usuário pode utilizar mknod() mesmo sem ser root.

Dentro de um programa, um tubo com nome pode ser eliminado através da primitiva unlink(const char *pathname), onde pathname indica o nome do tubo a ser destruído.

Exemplo:

               /* arquivo test_fifo.c */

/* este programa mostra a criacao e destruicao de tubos
 * com nome
 */

#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
     printf("Vou criar um tubo de nome 'fifo1'\n") ;
     printf("Vou criar um tubo de nome 'fifo2'\n") ;
     if (mknod("fifo1",S_IFIFO | O_RDWR, 0) == -1) {
          perror("Criacao de fifo1 impossivel") ;
          exit(1) ;
     }
     if (mknod("fifo2",S_IFIFO | O_RDWR, 0) == -1) {
          perror("Criacao de fifo2 impossivel") ;
          exit(1) ;
     }
     sleep(10) ;
     printf("Vou apagar o tubo de nome 'fifo1'\n") ;
     unlink("fifo1") ;
     exit(0);
}

Resultado da execução:

O programa é lançado em background e pode-se verificar (através do comando shell ls -l fifo*) que os tubos denominados fifo1 e fifo2 foram criados e depois, que o tubo fifo1 foi destruído.

euler~/> test_fifo &
[2] 812
Vou criar um tubo de nome 'fifo1'
Vou criar um tubo de nome 'fifo2'
euler:~/> ls -l fifo*
p---------   1 saibel   prof            0 Sep 27 10:07 fifo1|
p---------   1 saibel   prof            0 Sep 27 10:07 fifo2|
euler:~/> Vou apagar o tubo de nome 'fifo1'

[2]    Done                          test_fifo
euler:~/> ls -l fifo*
p---------   1 saibel   prof            0 Sep 27 10:07 fifo2|

Observações:


next up previous
Next: Manipulação das FIFOs Up: Criação de um tubo Previous: Criação de um tubo
Celso Alberto Saibel Santos 2000-11-14