Ben Xcode bir kez çok fazla "kırık boru" hatası aldım. Şimdi bir borunun tam olarak ne olduğunu merak ediyorum.
"Boru" kavramı nedir ve nasıl "kırılabilir"?
Ben Xcode bir kez çok fazla "kırık boru" hatası aldım. Şimdi bir borunun tam olarak ne olduğunu merak ediyorum.
"Boru" kavramı nedir ve nasıl "kırılabilir"?
Yanıtlar:
Boru, bir işlemin standart çıktısını diğerinin standart girişine bağlamak için kullanılan bir süreçler arası iletişim (IPC) mekanizmasıdır.
Bir dosyada "pax" kelimesini aramak istediğinizde bir örnek:
cat filename | grep pax
ve evet, grep
dosyayı doğrudan yapabileceğinizi biliyorum ama bu nasıl çalıştığını açıklamıyor, değil mi?
Bu, cat
komutun standart çıktısını komutun standart girişine bağlar grep
. cat
dosyanın içeriğini standart çıktısına gönderir ve grep
dosyasını (bu durumda) standart girdisinden okur. Süreçleri bu şekilde birbirine bağlayarak, istediğiniz sayıda boru segmentinden oluşan kendi araçlarınızı oluşturabilirsiniz. Gibi şeyler:
show_users | grep pax | awk -F: '{print $4}' | tr '[a-z]' '[A-Z]' | cut -c1-20
Bir kırık boru gönderen hala aracılığıyla şeyler göndermeye çalışıyor iken verilerin (genellikle) alıcı bağlantıyı kapattı biridir.
Örneğin, bir çağrı programı aracılığıyla büyük bir dosya gönderirseniz (bir kerede bir sayfa görüntülemek için):
cat myfile | pager
ve sonra a yapın CTRL-BREAK, bu pager
işlemin giriş borusunu cat
kullanmayı bitirmeden kapatmasına neden olabilir . Bu kırık boruyu almak için bir olasılık.
Bir cursory Google aramasından , bu özel sorun geçici dağıtımlarla ilişkili gibi görünüyor ve verilen çözümler genellikle yazılımınızın çoğundan çıkmayı ve cihazlarınızın çoğunu yeniden başlatmayı içerir.
Bu muhtemelen sorunu Apple'a bildirecek kadar ciddidir. Bu konuda ne kadar şikayetçi olursa, bunu düzeltmek için bir şey yapılması daha olasıdır.
pr -e4 -n ten-thousand-lines.c | sed 10q
kırık bir boru ile sona erer. İster pr
rahatsız ediyor o SIGPIPE sinyali başka bir konu var olduğunu söylemek için; sinyalin bir sonucu olarak kolayca çıkabilir (sıfırdan farklı bir çıkış durumu oluşturur).
|
Karakter genellikle bir boru denir. Çeşitli UNIX mermilerinde (bildiğim), bir komutun çıkışını diğerinin girişine bağlamak için kullanılabilir.
cat myfile.txt | head
head
Komut sadece girişin ilk birkaç satır gösterir. Bu noktada, girdisini kapatır. Bu, girdiyi üreten komut için bir sorun oluşturur. Nereye yazıyor? Bu duruma veya yazma sürecinin okuyucu bitmeden sona erdiğinde, buna "kırık boru" denir.
cat
Komutun sonsuza dek sürmesini önlemek için UNIX standardı, gönderdiği özel bir sinyali ( SIGPIPE , sinyal 13 ) tanımlar cat
. Bu sinyal için varsayılan eylem, işlemi cat
sonlandıran işlemi öldürmektir .
Kullandığınız uygulama, gördüğünüz küçük açılır pencere iletisini oluşturan SIGPIPE dahil tüm sinyaller için bir sinyal işleyici yükledi.
Bu hata oldukça sık görülür. /programming/490366/ad-hoc-deployment-issue-putpkt-write-failed-broken-pipe "... Xcode'un telefonunuzla konuşma yeteneğinde dahili bir hata. yani yanlış bir şey yaptınız, bu geliştirme sistemindeki bir hata "
Boru, Unix sistemlerinde bir IPC mekanizmasıdır. Bir borunun iki ucu, bir okuma ucu ve bir yazma ucu vardır. Yazma ucuna yazılan veriler, okunan uçtan okunabilir ve yazıldığı sıraya göre çıkar.
Unix komut satırı dünyasında, borular bir işi yapmak için programları birbirine bağlamanın çok yaygın bir yoludur. Örneğin sed 's/foo/bar/g' fred.txt | grep -e 'bar.*baz'
, dosyada fred.txt
dizenin tüm örneklerini dizeyle değiştirir foo
, bar
ardından sonucu bar
bir dizi karakter izleyen satırları arar , sonra baz
.
Bu, elbette, çok yararlı görünmüyor. Ancak eminim ki, özellikle her tür ilginç kullanıma nasıl koyabileceğinizi, özellikle de sizin gibi awk
veya perl
emrinizde olan programlarınız olduğunda görebilirsiniz .
Boru sistemi en başından beri Unix'in bir parçası olmuştur. Ve boru hattınızdaki bir işlemden çıkılırsa, genellikle boru hattındaki tüm programların çıkmasını istersiniz. Bu, varsayılan olarak, okunan uçtaki işlem gitmişse bir boruya yazan bir işlemin bir SIGPIPE
sinyal alacağı anlamına gelir . Ve eğer bu sinyali bloke ederse, write
yine de borunun 'kırıldığını' belirten özel bir hata ile başarısız olur.
Varsayılan SIGPIPE
işlem, alan işlemi öldürür. Ve eğer boru hattının 'başı' değilse, her SIGPIPE
şey zinciri yukarı doğru ilerletir.
Xcode'un şikayet ettiği şey, kendisine giden bir boru ile bir şeyler yapmak için bazı alt programlara başlaması ve bu alt programın boruyu kırık bırakması beklenmedik bir şekilde öldüğü ..
“Kırık” boru, bir ucunun yapıldığı close()
ve diğer ucunun okunduğu veya üzerine yazıldığı bir borudur . Örneğin, aşağıdaki kabuk komutunda:
cat foo | less
cat
Süreç borunun yazma ucunu tutar ve less
işlem birini okuma. Okuyucu işlemi boruyu kapatırsa, boru kırılır (ve dolayısıyla işe yaramaz); yazar işlemi işletim sisteminden "kırık boru" hatasını alır.
cat
biter bitmez belli olur), okuyucu sadece normal bir dosya sonu görecektir.