İçinde
./binary < file
binary
'ın stdin dosyası salt okunur modda açık. Not bash
dosyayı hiç okumuyor, sadece o yürütür sürecin dosya tanımlayıcı 0 (stdin) okuma için açılır binary
içinde.
İçinde:
./binary << EOF
test
EOF
Kabuğa bağlı olarak binary
stdin, silinmiş bir geçici dosya (AT&T ksh, zsh, bash ...) test\n
tarafından kabuğun koyduğu veya bir borunun okuma ucunun içerdiği ( dash
, yash
; ve kabuk test\n
paralel olarak yazacaktır) olacaktır . borunun diğer ucunda). Senin durumunda, kullanıyorsanız bash
, geçici bir dosya olurdu.
İçinde:
cat file | ./binary
Kabuğa bağlı olarak, binary
stdin bir borunun okuma ucu veya yazma yönünün kapatıldığı (ksh93) ve diğer ucunun cat
içeriğini yazan soket çiftinin bir file
ucu olacaktır.
Stdin normal bir dosya olduğunda (geçici veya değil), aranabilir. binary
başına veya sonuna gidebilir, Aynı zamanda, bazı yapmak mmap'e vb, geri sarma ioctl()s
(kullanılıyorsa FIEMAP / FIBMAP gibi <>
yerine <
o, içinde etc / yumruk delikleri kesecek olabilir).
Öte yandan boru ve soket çifti, bir işlemler arası iletişim araçları olan pek bir şey yok binary
yanında yapabilir read
(bazı boru özgü gibi bazı işlemler olmasına rağmen veri ing ioctl()
üzerlerinde uymaya düzenli dosyalar üzerinde olabilir ler) .
Çoğu kez, bu eksik yeteneği var seek
boruları ile çalışırken başarısız olmasına uygulamalar neden / şikayet ama farklı türdeki dosyalar düzenli dosyalar üzerinde geçerli değil diğer sistem çağrıları herhangi biri olabilir (gibi mmap()
, ftruncate()
, fallocate()
) . Linux'ta, /dev/stdin
fd 0 bir pipo ya da normal bir dosyadayken açarken davranışlarınızda büyük bir fark var .
Orada sadece aranabilir dosyalarla başa çıkabilen birçok komut vardır , ancak bu durumda, genellikle kendi stdin'lerinde açılan dosyalar için değildir.
$ unzip -l file.zip
Archive: file.zip
Length Date Time Name
--------- ---------- ----- ----
11 2016-12-21 14:43 file
--------- -------
11 1 file
$ unzip -l <(cat file.zip)
# more or less the same as cat file.zip | unzip -l /dev/stdin
Archive: /proc/self/fd/11
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of /proc/self/fd/11 or
/proc/self/fd/11.zip, and cannot find /proc/self/fd/11.ZIP, period.
unzip
dosyanın sonunda depolanan dizini okuması ve ardından arşiv üyelerini okumak için dosyanın içinde arama yapması gerekir. Fakat burada, dosya (ilk durumda normal, ikinci sırada yer alan boru), ana öğenin önceden açmış olduğu bir fd'yi miras almak yerine kendisine bir yol argümanı olarak verilir unzip
ve unzip
kendisini açar (tipik olarak 0'dan fd'de). Zip dosyalarını stdin'den okumaz. stdin çoğunlukla kullanıcı etkileşimi için kullanılır.
Kendinizinkini binary
, bir terminal emülatöründe çalışan etkileşimli bir kabuğun isteminde yeniden yönlendirme yapmadan çalıştırırsanız, binary
stdin, ebeveyninin kendisinden devraldığı ve terminal emülatörünün devraldığı kabuk olacaktır. pty cihazı okuma + yazma modunda açılır (bunun gibi /dev/pts/n
).
Bu cihazlar da aranamaz. Yani, binary
terminalden giriş çekerken tamam çalışıyorsa, muhtemelen sorun arama ile ilgili değildir.
Eğer bu 14 errno (sistem çağrılarının başarısız olması ile ayarlanan bir hata kodu) anlamına geliyorsa, çoğu sistemde bu EFAULT
( Kötü adres ) olacaktır. read()
Yazılabilir değil bir bellek adresine okumak için istenirse sistem çağrısı bu hata ile başarısız olur. Bu, fd'nin verileri noktalardan bir boruya mı yoksa normal bir dosyaya mı okumasından bağımsızdır ve genellikle bir hatayı ( 1) gösterir .
binary
muhtemelen stdin (açık) üzerinde bulunan dosyanın türünü belirler ve fstat()
ne normal bir dosya ne de bir tty cihazı olduğunda hataya neden olur.
Uygulama hakkında daha fazla şey bilmeden söylemek zor. Altında çalıştırma strace
(veya truss
/ veya tusc
sisteminizde) eşdeğeri, burada başarısız olursa, sistemin ne aradığını görmemize yardımcı olabilir.
1 Sorunuzla ilgili bir yorumda Matthew Ife tarafından öngörülen senaryo burada çok makul görünüyor. Ondan alıntı:
Verinin okunması için bir arabellek boyutu almanın, aramanın işe yaramadığı gerçeğini kötü bir şekilde ele almasının ve olumsuz bir boyut tahsis etmeyi denemesinin (kötü bir malloc kullanmama) sorununu çözdüğünden şüpheleniyorum. Tampon verilen hataların geçerli olduğunu okumak için tamponun geçilmesi.