2016-03-23 10 views
1

üzerinde Ne olur? posix pipe as a work queuePOSIX boru: Burada desribed gibi bir iç ileti Sırasından olarak bir boru kullanmak istediğiniz bloke yazma + sinyal

glibc'nin belgelerine göre boruya yazma eğer atomik olduğunu veriler PIPE_BUF'den daha küçüktür. https://www.gnu.org/software/libc/manual/html_node/Pipe-Atomicity.html#Pipe-Atomicity

Ancak: Bir sinyal meydana geldiğinde yazma işlemi kesintiye uğrayabilir. Varsayalım, write, boru neredeyse dolu olduğu için engellenir. Şimdi bir sinyal var. Bu veri boruya atomik olarak yazılacak mı?

template <typename T> 
ssize_t put(const T& data) 
{  
    static_assert(sizeof(T) < PIPE_BUF, "We use the atomic property of the pipe write. So sizeof(T) MUST be smaller than PIPE_BUF"); 

    int written; 
    const size_t id = T::value; 
    written = write(m_fds[write_fd], &id, sizeof(size_t)); 
    assert(written == sizeof(size_t)); 

    const size_t sT = sizeof(T); 
    write(m_fds[write_fd], &sT, sizeof(size_t)); 
    assert(written == sizeof(size_t)); 

    write(m_fds[write_fd], &data, sizeof(T)); // * this blocks in example 
    assert(written == sizeof(T)); 

    return sizeof(T); 
} 

cevap

1

Atom sadece "the whole amount written in one operation is not interleaved with data from any other process."

Sinyal kesinti biraz farklı olduğu anlamına gelir. the man page of signal'a göre, bir boru "yavaş cihaz" dır. Bu nedenle, SA_RESTART ayarlanmadığı sürece, write işlemi, yazdırılan veri sayısıyla başarıyı döndürür. Bu nedenle, tüm verilerin yazıldığından emin olmak için yazımın dönüş değerini her zaman kontrol etmek daha iyidir. Alternatif olarak, olası sinyalleri maskeleyebilirsiniz.

+0

Teşekkürler! Bir writev() 'in bu bağlamda yazdığı gibi üç maddeyi de boruya yazıp yazmadığını sorabilir miyim? Aksi takdirde, bir muteks'e ihtiyacım olurdu ve atomik özellik benim için işe yaramıyordu. –

+0

İkinci soruma cevap vermek için: evet işe yarıyor. http://man7.org/linux/man-pages/man2/writev.2.html "readv() ve writev() tarafından gerçekleştirilen veri aktarımları atomiktir" –