Existe diferença entre você e c no mknod?

6

De man mknod no Linux:

 c, u   create a character (unbuffered) special file

Por que existem 2 letras para a mesma função? Existe alguma diferença sutil, ou eles são completamente iguais?

    
por user123456 20.10.2016 / 00:27

1 resposta

13

Eles são idênticos, pelo menos no Linux.

Cheguei a essa conclusão analisando primeiro o código-fonte para mknod(1) no GNU coreutils , onde na linha 217 da versão atual encontramos que o 'c' e 'u' casos são tratados de forma idêntica, obtendo o mesmo tipo de dispositivo. O valor S_IFCHR é definido nos cabeçalhos do kernel do Linux, mas o valor não é importante. Tudo o que importa é que o mesmo valor seja armazenado no nó dev do sistema de arquivos.

Concluí o problema com um teste simples:

$ sudo mknod /dev/null2 u 1 3
$ ls -l /dev/null*
crw-rw-rw- 1 root root 1, 3 Jan 12  2015 /dev/null
crw-r--r-- 1 root root 1, 3 Oct 19 22:56 /dev/null2

Um u no comando fornece o mesmo nó dev de c . Caso encerrado.

Quanto a por que ambos os caracteres são permitidos, meu melhor palpite é que é apenas um alias para aqueles que pensam em b como "buffer" em vez de "bloquear", de modo que você precisa u como seu oposto, significando "sem buffer", em vez de c para "caractere".

Eu pensava que esse recurso do GNU mknod poderia ter sido compatível com algum tipo de sabor pré-Linux do Unix, já que mknod em GNU Fileutils é anterior ao próprio Linux, ¹ e esse recurso do GNU mknod fica claro de volta para o primeiro check-up controlado por versão de mknod.c , mas ainda tenho que encontrar documentação para qualquer Unix que aceite u como um argumento para mknod(1) , então essa hipótese não sustenta a água.²

Além disso:

  1. Um utilitário mknod foi adicionado ao GNU Fileutils em julho de 1991. A primeira versão do kernel do Linux não foi publicada na Usenet até setembro de 1991. Isso nos diz que a primeira versão do GNU mknod deve suportam sistemas operacionais não-Linux desde o início.

  2. Eu verifiquei as páginas de manual on-line para Solaris , HP-UX , AIX , FreeBSD , SCO OpenServer , SCO UnixWare , Minix 2 , Ultrix , 2.11BSD e OS X .

    Você encontrará mknod u documentado para outros sistemas operacionais - como Minix 3 - mas apenas porque eles também estão usando a implementação GNU Coreutils de mknod(1) . Outra peculiaridade é o Solaris moderno, que envia AT & T mknod e GNU mknod , documentados separadamente nas seções manuais 1m (link acima) e na seção 1g, respectivamente.

por 20.10.2016 / 01:02