Оскільки ваша програма може чекати вводу-виводу або призупинено іншим способом. SIGPIPE асинхронно перериває вашу програму, завершуючи системний дзвінок, і тому може бути негайно оброблено.
Оновлення
Розглянемо трубопровід A | B | C
.
Тільки для визначеності ми припустимо, що B - це канонічний цикл копіювання:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
write(STDOUT,bufr,sz);
B
блокується на читання (2) очікування виклику для даних з , A
коли C
завершується. Якщо ви дочекаєтесь коду повернення із write (2) , коли B побачить його? Відповідь, звичайно, не до тих пір, поки А не напише більше даних (а це може бути довгим очікуванням - а що, якщо А заблоковано чимось іншим?). До речі, зауважте, що це також дозволяє нам зробити більш просту, чисту програму. Якщо ви залежали від коду помилки при записі, вам знадобиться щось на зразок:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
if(write(STDOUT,bufr,sz)<0)
break;
Чергове оновлення
Ага, ви розгублені щодо поведінки запису. Ви бачите, коли дескриптор файлу із очікуваним записом закритий, SIGPIPE відбувається саме тоді. Хоча запис в кінцевому підсумку поверне -1 , суть сигналу полягає в тому, щоб асинхронно повідомити вас про те, що запис більше неможлива. Це частина того, що змушує всю елегантну спільну структуру труб працювати в UNIX.
Тепер я міг би вказати вам на цілу дискусію в будь-якій з кількох книг із системного програмування UNIX, але є краща відповідь: ви можете це перевірити самостійно. Напишіть просту B
програму [1] - у вас вже сміливість, все, що вам потрібно - це, main
а деякі включає - і додайте обробник сигналу для SIGPIPE
. Запустіть конвеєр типу
cat | B | more
а в іншому вікні терміналу приєднайте відладчик до B і поставте точку зупинки всередину обробника сигналу B.
Тепер вбивайте більше, і B повинен зламати ваш обробник сигналу. вивчити стос. Ви виявите, що прочитання все ще очікує на розгляд. нехай обробник сигналу продовжує і повертається, і подивіться на результат, повернутий записом - який тоді буде -1.
[1] Звичайно, ви напишете свою програму B мовою C. :-)
write
.