2016-03-27 18 views
1

Konsola iki sekme açtığımı söylerim (Tab1 ve Tab2). Ben her ikisinde de tty çalıştırdığınızdaPrintf'ten gelen mesajlar terminale nasıl yönlendirilir?

Ben:

Tab1:

~$ tty 
/dev/pts/23 

Tab2:

~$ tty 
/dev/pts/24 

Bir printf ile basit bir program hello.c çalıştırırsanız ("Merhaba") Tab1'de, sistem yazımdan stdout'a (dosya kimliği 1) yazma/dev/pts/23'e yazma, konsole tarafından okunma ve Tab1'de görünme biçimine nasıl gider?

Sistem "Hello" dizesini/dev/pts/23 dizinine/dev/pts/24 dizinine vermesi gerektiğini nasıl biliyor? Ve bunu nasıl yapıyor?

Programın bash tarafından verilen bir parametresi var mı? Bu nedenle, hangi "psudoterminal" in "Merhaba" u göndereceğini biliyor mu? Ya da program diziyi, hangi psödoterminalin veriyi göndereceğini bilen bash'a (nasıl?) Geri gönderir? Eğer süreç açık dosyalar bakarsak

Gördüğünüz, yardımlarınız

+1

Açık dosyalar kümesi her işlem için yereldir. Kabuğun, stdin/out/err yuvalarında açık olan özel bir sözde terminal aygıtı vardır; bu, ortaya çıktığında alt süreçler tarafından miras alınır. Sözde terminalin kendisi esas olarak sistem çağrısı tarafından tahsis edilen ve x-terminalinin ya da kullandığınız her şeyin ekranın diğer ucundan metin okuyup yazdığı bir adlandırılmış borudur. [Bu iyi bir okuma] (http://www.linusakesson.net/programming/tty/) bu arada. – doynax

cevap

1

için teşekkür ederiz olduğunu zaten söz konusu tty kullanılarak anladım belirli psuedo terminaline STDOUT STDERR, vs noktaları

[email protected]:~# ls -l /proc/self/fd 
total 0 
lrwx------ 1 root root 64 May 21 02:18 0 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 1 -> /dev/pts/3 
lrwx------ 1 root root 64 May 21 02:18 2 -> /dev/pts/3 

Bildiğiniz gibi, bir üst dosyada açık dosya tanıtıcılarını çoğaltan bir fork sistem çağrısı tarafından bir işlem oluşturulur. temel olarak, işleminiz dosya tanıtıcılarını kendi ana sayfasından alır.

Ebeveynler bunlarla nasıl ilişkili ısınıyordu? iyi, konsole zaten bununla uğraştı.

+0

Cevabınız için teşekkür ederiz. ls -l/proc/self/fd'yi yaptığımda, çekirdeğin bu çağrıyı hangi terminalden yaptıklarını nereden biliyor? Bu konsolu her konsolu sekmesinde neden farklı? –

+1

"Kontrol terminali" için ağı arayın. Buradan başlayın: https://www.gnu.org/software/libc/manual/html_node/Controlling-Terminal.html – stdcall

İlgili konular