Eşzamanlı yazma için adlandırılmış bir boruya verilen garantiler nelerdir?


32

Örneğin, aşağıdaki gibi adlandırılmış bir boru oluşturdum:

mknod myPipe p

Ve bir işlemden okudum (örneğin, bazı sunucular). Örneğin, kuyruk kullandım:

tail -f myPipe

Birkaç müşteri işlemi içine bazı mesajlar yazarsa (örneğin, echo "msg" >> myPipemesajların araya girme olasılığı var, şöyle:

 <beginning of message1><message2><ending of message1>

Yoksa adlandırılmış yöneltme'ye yazma işlemi atomik midir?

Yanıtlar:


29

Her bir işlemin ne kadar yazdığına bağlıdır (işletim sisteminizin POS bu konuda uyumlu olduğu varsayılmaktadır). Kimden write():

Bir boruya veya FIFO'ya yazma istekleri, aşağıdaki istisnalar dışında normal bir dosyayla aynı şekilde ele alınır:
[...]

  • {PIPE_BUF} bayt veya daha az olan yazma istekleri , aynı boru üzerinde yazma yapan diğer işlemlerden elde edilen verilerle serpiştirilmez . {PIPE_BUF} bayttan büyük olan yazma işlemleri, isteğe bağlı sınırlar dahilinde, dosya durum bayraklarının O_NONBLOCK bayrağının ayarlanmış olup olmadığına bakılmaksızın, diğer işlemler tarafından yapılan yazmalarla, isteğe bağlı sınırlar üzerinde veri serpiştirilmiş olabilir.

Ayrıca boru ve FIFO'lara ilişkin Gerekçe bölümünde :

  • Atomik / atomik olmayan : Bir işlemde yazılan miktarın tamamı başka bir işlemden elde edilen verilerle birleştirilmezse, yazma işlemi atomdur. Bu, tek bir okuyucuya veri gönderen birden fazla yazar olduğunda kullanışlıdır. Uygulamaların, bir yazma isteğinin atomik olarak ne kadar büyük beklenebileceğini bilmesi gerekir. Bu maksimum {PIPE_BUF} olarak adlandırılır. Bu POSIX.1-2008 birimi, {PIPE_BUF} bayttan daha fazla yazma isteğinin atomik olup olmadığını söylemez, ancak {PIPE_BUF} veya daha az baytın yazmasının atomik olmasını gerektirir.

Değeri, eğer PIPE_BUFher bir uygulama ile tanımlanan, ancak en az 512 bayt (bakınız, olduğu limits.h). Linux'ta, 4096 bayttır (bkz. pipe(7)).


5
PIPE_BUF, bu arada, en az 512 olarak garanti edilir. Ayrıca, işleminizin gerçekte her satırı tek bir yazma çağrısında yazacağını garanti etmeniz gerektiğini unutmayın . Line buffering ( setvbuf(stdout, NULL, _IOLBF,512)) işlevini etkinleştirmek , düşük seviyeli işlevleri kullanmanıza gerek kalmadan bunu gerçekleştirir.
Random832 16.03

İşte PIPE_BUFyaygın Unix sistemlerinde gözlenen değerlerin bir tablosu : ar.to/notes/posix#pipe-buf
Arto Bendiken

Soketlerin nasıl çoğullanabileceğini anlamıyorum ... ama adlandırılmış yöneltmeler olamaz? unix üzerindeki her şey sadece bir dosya değil mi? lulz
Alexander Mills,

@AlexanderMills: Yorumunuzu anlamıyorum
Mat

1
@AlexanderMills: hayır, asgari değer budur
Mat
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.