Unix sürecinin Broken pipe ile ölmesini sağlayan nedir?


30

İşte düşündüğüm bazı seçenekler, hangisinin doğru olduğuna emin değilim.

  1. Borulardan okunan bir G / Ç hatası oluştu.
  2. Borunun diğer ucuna yazma işlemi başarısızlıkla sonuçlandı.
  3. Boruya yazabilecek tüm işlemler onu kapattı.
  4. Borunun yazma tamponu dolu.
  5. Eş, çift yönlü borunun diğer yönünü kapattı.
  6. Borulardan okunabilecek hiçbir işlem olmadığından yazma başarısız oldu.
  7. Bir sistem çağrısı EPIPE hatasını döndürdü ve hata işleyicisi kurulmadı.

Sorunuz nedir? Bunların hangisinin doğru olduğunu mu soruyorsunuz, yoksa kırılmış boruya neden olabilecek başka şeyler var mı?
EightBitTony

@EightBitTony Bunların hangisi doğrudur
siamii

Yanıtlar:


38

Bir işlem, okuyucusu olmayan bir boruya (adlandırılmış veya değil) veya SOCK_STREAM tipi bir sokete yazmaya çalıştığında bir SIGPIPE alır.

Genelde istenen davranış. Tipik bir örnek:

find . | head -n 1

Bir findkere headsonlandırıldıktan sonra çalışmaya devam etmek istemezsiniz (ve daha sonra bu dosya üzerinde okumak için açık olan tek dosya tanımlayıcısını kapattı).

yesKomut tipik sonlandırmak için bu sinyalin dayanır.

yes | some-command

Bazı komutlar sona erene kadar "y" yazacaktır.

Sadece komutlar çıktığında değil, tüm okuyucular boruya okumalarını kapattığını unutmayın. İçinde:

yes | ( sleep 1; exec <&-; ps -fC yes)
      1 2       1        0

1 (alt kabuk), sonra 2 (alt kabuk + uyku), sonra 1 (alt kabuk) ve sonra alt kabuk kendi stdinini kapattıktan sonra borudan 0 fd okuyacak ve o zaman yesbir SIGPIPE alacaksınız.

Yukarıda, çoğu kabuk bir pipe(2)süre ksh93kullanır socketpair(2), ancak davranış bu açıdan aynıdır.

Bir süreç SIGPIPE, yazma sistemi çağrıyı görmezden zaman (genellikle writefakat olabilir pwrite, send, splice...) bir ile döner EPIPEhatası. Bu nedenle, kırılmış boruyu manuel olarak ele almak isteyen işlemler tipik olarak SIGPIPE'yi göz ardı eder ve bir EPIPE hatasıyla harekete geçer.


14

(6)

Borulardan okunabilecek hiçbir işlem olmadığından yazma başarısız oldu.

Tanımlayıcıları ve çatalı kopyalamadığınız sürece, başlayacak tek bir işlem olabilir: genellikle bir borunun bir okuyucusu ve bir yazarı vardır ve bunlardan biri bağlantıyı kapattığında, boru kesilir. Adlandırılmış bir boru kullanıyorsanız, onunla birden çok bağlantı (seri olarak) yapabilirsiniz, ancak her biri bu anlamda yeni bir boru temsil eder. Bir iş parçacığına veya işlemine bir "pipe", bir dosya tanıtıcısı ile eşanlamlıdır.

Kimden man 7 pipe:

Bir borunun okuma ucuna atıfta bulunan tüm dosya tanımlayıcıları kapatılmışsa, o zaman bir yazma (2) çağıran işlem için bir SIGPIPE sinyalinin üretilmesine neden olacaktır. Çağıran işlem bu sinyali görmezden geliyorsa, write (2) EPIPE hatasıyla başarısız olur.

Bu yüzden, bir "kırık boru", yazarın EOF'nin okuyucuya ne olduğudır.


0

Okuma işleminden yazma işleminden önce çıkıldığında kırık bir boru oluşuyor. Bu yüzden giderdim (6)


2
Bir boruya okuma veya yazma işlemi birden fazla olabilir ve aynı işlem okuma ve yazma olabilir. Ayrıca, çıkmakla ilgili değil, dosya tanımlayıcısını kapatmakla ilgili.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.