Crie um par de dispositivos de caracteres gerais

2

Gostaria de criar um dispositivo de caracteres que tenha as mesmas propriedades de um pseudo-terminal padrão, mas que possa ser nomeado em um nome específico.

Basicamente eu gostaria de ter / dev / pts / meu-nome-exclusivo em vez dos números que podem ser reutilizados. Existe uma maneira de fazer isso? Por exemplo, mknod pode criar dispositivos char arbitrariamente conectados?

    
por viraptor 17.03.2011 / 14:16

2 respostas

1

O mknod funcionará, com algumas exceções. A sintaxe é:

mknod /path/to/new/dev c major minor

Assim, por exemplo, você provavelmente poderá criar um novo dispositivo do tipo pts com

mknod /tmp/mypts c 136 0

O que eu encontrei, no entanto, é que se você tentar fazer isso em / dev / pts, você receberá uma mensagem de acesso negado. Eu posso fazer isso em / dev, apenas não / dev / pts. Estou em uma caixa do Centos 5.5. YMMV.

Isso ocorre porque / dev / pts é montado pelo kernel (do meu arquivo / etc / fstab):

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

Este é um pseudo sistema de arquivos gerenciado pelo kernel, e eu não acho que isso seja uma boa idéia. A maneira padrão de obter um novo arquivo criado lá é abrir () / dev / ptmx; que receberá o processo de chamada do fd do terminal mestre designado, e um novo dispositivo será criado como / dev / pts / X, onde X é alocado dinamicamente por ptmx como escravo. Isso seria então aberto, geralmente por um processo bifurcado do original.

Há provavelmente uma boa razão para isso ser feito dessa maneira. Eu não tenho certeza do que é, mas eu evitaria tentar quebrá-lo, se a estabilidade do sistema é algo que você valoriza.

Isso tudo dito, a primeira linha de comando com opções reais que eu apresentei permitiria que você fizesse seu próprio dispositivo pts em qualquer lugar mas / dev / pts, e dependendo do que você pretendia fazer com isso, talvez seja o suficiente para levar você aonde você está indo.

    
por 24.03.2011 / 14:59
1

O que você está pedindo é essencialmente um caso de uso para usar pseudoterminales BSD . O driver de dispositivo pseudo-terminal BSD tinha 256 pares de números de inode (com cada par consistindo de um mestre e um escravo), e os inodes correspondentes foram criados em / dev na instalação e deixados dessa maneira.

Nada no kernel impunha qualquer nomenclatura em particular, mas um aplicativo que precisasse procurar um par não usado normalmente teria algumas expectativas sobre a nomenclatura.

A maioria das pessoas considera os pseudoterminais BSD obsoletos com a introdução dos pseudo-terminais Unix 98. E parece que várias distribuições Linux diminuíram o suporte para pseudoterminais BSD. No entanto, se você puder encontrar um kernel que ainda tenha suporte para pseudoterminais BSD, então você pode usar esse suporte para criar um par de inodes de dispositivo exatamente como você está pedindo.

mknod /dev/my-master c 2 42
mknod /dev/my-slave c 3 42

Observe que eles precisam permanecer fora de /dev/pts , pois /dev/pts é para pseudoterminais do Unix 98.

Se você precisar apenas transferir um fluxo de caracteres e não precisar de todos os outros recursos que um pseudo-terminal tem a oferecer, talvez seja mais fácil usar um canal nomeado.

    
por 14.03.2015 / 23:00

Tags