OS X'te, Linux dışında desteklendikleri tüm sistemlerde olduğu /dev/fd/x
gibi , açılış a yapmak gibidir dup(x)
, sonuçta elde edilen fd, fd x ile aynı açık dosya tanımına işaret eder ve özellikle dosya içinde aynı ofsete sahip olur.
Linux burada bir istisnadır. Linux'ta, fd x'de açılan dosyaya /dev/fd/x
bir sembolik bağlantı /proc/self/fd/x
ve /proc/self/fd/x
sahte bir sembolik bağlantıdır. Linux'ta open("/dev/fd/x", somemode)
, açıkken aynı dosyaya yepyeni bir açık dosya açıklaması alırsınız x
. Elde ettiğiniz yeni fd hiçbir şekilde fd x ile ilişkili değildir. Özellikle, ofset dosyanın başlangıcında olacaktır O_APPEND
(tabii ki ile açmanız dışında ) ve mod (okuma / yazma / ekleme ...) fd x'deki moddan farklı olabilir (hatta ters modda açarken borunun diğer ucu gibi fd x'de olanlardan oldukça farklı bir şey). (Bu aynı zamanda, örneğin açamadığınız soketler için işe yaramayacağı anlamına gelir () ).
Yani, Linux'ta,
exec 5<> file
echo test >&5
Fd 5'in ofseti dosyanın sonundadır. Yaparsan
cat <&5
Hiçbir şey almıyorsunuz.
Yine de yaptığınız zaman:
cat /dev/fd/5
Görüyorsunuz test
çünkü cat
yeni bir salt okunur fd file
, fd 5 ile ilgisiz hale geliyor.
Diğer sistemlerde,
cat /dev/fd/5
cat
fd 5'in bir kopyası olan bir fd alır, bu yüzden hala dosyanın sonunda bir ofset ile.
Bunun nedeniyle çalışmasının less
nedeni, less
bir nedenden ötürü, lseek()
dosyanın başlangıcında bu fd'yi ( lseek(1); lseek(0)
dosyanın aranabilir olup olmadığını belirlemek için yapar ) olmasıdır.
Burada, muhtemelen her ikisinin de farklı ofsetleri olmasını istiyorsanız, okumak için bir fd ve yazmak için bir fd'ye sahip olmak istersiniz:
exec 5< file 9>&1 > file
Yoksa eğer hala orada dosyayı yeniden açabilir veya bir yapmanız gerekecek lseek()
olarak less
yapar.
ksh93
ve zsh
yerleşik bir lseek()
operatöre sahip tek mermiler :
cat <&5 <#((0)) # ksh93
{sysseek 0; cat} <&5 # zsh, zmodload zsh/system to enable that builtin
Veya:
cat /dev/fd/5 5<#((0)) # ksh93
sysseek -u 5 0; cat /dev/fd/5 # zsh