2012-02-16 7 views
6

Ben wc & veya hemen standart istiyor cat & gibi bir komut, buBir çocuğun stdin sorup sormadığını nasıl anlarım? Bunu durdurmak için nasıl söylerim? Bash olarak

[1] + kedi

Durduruldu Bu nasıl gerçekleştirilir ile hemen döner çalışacak? Exec ile başladığım bir programı nasıl durduracağım ve bu programları en başta nasıl durduracağımı nasıl bilebilirim? Bu programların stdin'i istemesinin bir yolu var mı?

Teşekkürler!

PS ayrıca, + hakkında nedir? Ben her zaman merak ettim, ama bu gerçekten google ...

+2

"hard to google" sembolleri için +1 – Tim

+2

Bu sorunun cevaplarını aydınlatan şu yanıtları bulabilirsiniz: [Bir C programının yürütülebilir dosyasının ön planda veya arka planda çalışıp çalışmadığını nasıl bilebilirim?] (Http://stackoverflow.com/ sorular/2425005/nasıl yapılır-i-know-if-an-c-programları-yürütülebilir-is-in-ön-plan-veya-arka plan) –

cevap

1

setpgid() manuel sayfa bunun nasıl çalıştığını açıklıyor:

Bir oturum bir kontrol terminali olabilir. Herhangi bir zamanda, oturumdaki işlem gruplarının bir (ve yalnızca bir tanesi) terminal için önalan işlem grubu olabilir; Kalan süreç grupları arka planındadır. Terminalden bir sinyal üretilirse (ör. SIGINT üretmek için kesme anahtarını yazarak ), bu sinyal önplan işlem grubuna gönderilir. ( açıklaması için sinyalleri üreten karakterler için bkz. termios(3).) Terminalden grubu sadece ön işlem süreci read(2) olabilir; Bir arka plan işlem grubu , terminalden read(2) çalışırsa, gruba, bunu askıya alan bir SIGTSTP sinyali gönderilir. tcgetpgrp(3) ve tcsetpgrp(3) işlevleri, kontrol terminalinin ön plan işlemini grubunu almak/ayarlamak için kullanılır.Eğer yeni bir boru hattı oluştururken

  1. , PID'ini (yeni bir süreç grubundaki boru hattının tüm üyelerini koymak için setpgid() çağırır:

Ne yapmak istediğiniz budur Boru hattındaki ilk süreç PGID olarak). Eğer & ile arka planda bir boru hattı koyarsanız, tekrar kabuk kendi süreç grubu öncelikli süreç grubu yapmalıdır -

  • Kullanım tcsetpgrp() ön planda olan süreç grubu yönetmek için.

  • çocuk süreçlerin durumunu kontrol etmek WNOHANG ve WUNTRACED bayraklarıyla Çağrı waitpid() - onlar SIGTSTP tarafından durdurulduğu zaman bu sizi bilgilendirecektir, bash yaptığı gibi bir ileti yazdırmak için izin verecektir. Hiçbir zaman ve öncelik kısıtlamaları varsa

  • +0

    Siz, efendim ya da bayan, yaptınız. Bu uzun bir manuel sayfa, referans için teşekkürler. Yardım edemiyorum ama 73 sayfalık yanıtınız var, ama sadece üç soru var: Bu bir şey! Beni onurlandırıyorsun ve bana ilham veriyorsun. – Ziggy

    2

    Eğer yumurtlama programlarının kabuğun nasıl çalıştığına benzer davranmasını istiyorsanız, çocuğunuzu koruduktan sonra setpgrp()'u arayın. Bu, arka plan programının kendi işlem grubunda çalışmasına ve dolayısıyla ayrı bir tty'ye sahip olmasına neden olur. Konsolda I/O yapmaya çalıştığında, SIGTTIN veya SIGTTOU sinyallerini alır. SIGTTIN veya SIGTTOU'nun varsayılan davranışı, SIGSTOP gibi süreci durdurmaktır.

    Üst öğe olarak, waitpid() ve WUNTRACED kullanarak çocuk süreçlerini durdurup durdurmadığınızı öğrenebilirsiniz.

    +0

    'setpgrp()' POSIX'de eski olarak işaretlenir; tarihsel olarak SYSV ve BSD sistemlerinde farklı bir imzası vardı. 'setpgid()' tercih edilen arayüzdür. – caf

    2

    -+ işareti basitçe akım atıfta

    [Düzenlendi ana soruya cevap için diğer yanıtları görmek]. Her bir komut satırı (foo | bar | baz gibi),karakteriyle başlayarak jobspec kullanarak adlandırılabilecek bir iştir. %1 iş numarası 1, %+ geçerli iştir ve %- önceki iştir.

    İşler hakkında daha fazla bilgi için, Bash kılavuzunun Job Control section numaralı sayfasına bakın.

    +0

    İlk paragraf yanlış. "İşlem grubunun kontrol terminalinden" (ya da buna yakın bir şeyden - tam ayrıntıları unuttum), "stdin'den (dosya tanıtıcısı 0)" okumamalıdır. Bundan kaçınmanın mükemmel bir yolu, dosya tanımlayıcısının 0 bir terminale değil, örn. komut satırına

    +1

    Ve bu işlemi askıya alan kabuk değil, SIGTTIN için varsayılan işlemdir. Sinyal işleyici ile geçersiz kılınabilir. –

    +0

    Bence bu soruya cevap vermiyor, bash yerine c ile ilgili. Süreç nasıl askıya alınır ve bunun stdin'den okuduğunu nasıl bilebilirim. Unutma ben bash. (PS parçasına gidersiniz! Teşekkürler!) – Ziggy

    0

    Sen, bu çıkış yapmak elle sonra çatallı çocuk sürecinde system("command &") kullanabilirsiniz.

    İlgili konular