#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: