2010-11-08 22 views
5

Kendi psuedo-shell'imi yazmak istiyorum ve güzel renkler almak istiyorum. Sanal TTY'leri okudum, ancak bir tane nasıl oluşturulacağı ya da bir alt işlemin nasıl yapılacağı konusunda çok pratik bilgiler bulamadı isatty(stdout) == 1.Dosya isatty (3) yanıt verir

cevap

8

Aradığınız şey pseudoterminals, pseudo-ttys veya ptys olarak adlandırılır. Bunlar master/slave çiftlerinde var olup, benzer şekilde soket çiftlerine (boruların çift yönlü versiyonu; diğer ucunda yazılan bir uçtan diğerine okunabilir) davranırlar. kontrol süreçte, (muhtemelen /dev/pts/X) köle adını almak için, sonra bir ana açmak için ptsnameposix_openpt kullanın:

int master = posix_openpt(O_RDWR | O_NOCTTY); 
grantpt(master);  /* change ownership and permissions */ 
unlockpt(master); /* must be called before obtaining slave */ 
int slave = open(ptsname(master), O_RDWR | O_NOCTTY); 

Her zamanki gibi, her fonksiyon başarısız olabilir, bu nedenle hata denetimi ekleyin. slave fd artık slave cihazını ifade etmektedir. Standart çıkışı slave psödoterminaline ayarlamak için çocuk işleminde dup2(slave, STDOUT_FILENO) kullanın; stdin ve stderr için benzer şekilde.

(. some Linux manpages yanlış posix_openpt döner char * Ayrıca fonksiyonların openpty ailesi tarafından karışık belirtmektedirler dikkat edin; bu yalancı-uçbirim için kaldırıldı eski arabirim temsil eder.)

+1

'ek olarak STDOUT_FILENO', aynı zamanda çocuğun STDIN_FILENO ve STDERR_FILENO'larına pty kölemini de yapamazsınız. – caf

+0

Düzenlendi, teşekkürler. –

+0

Harika cevap, teşekkürler! –