diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index c1f0d69c4c..0cc7c6d4f9 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -978,6 +978,12 @@ ssize_t Process::sys$write(int fd, const void* data, size_t size) if (!descriptor) return -EBADF; auto nwritten = descriptor->write((const byte*)data, size); + if (has_unmasked_pending_signals()) { + block(BlockedSignal); + Scheduler::yield(); + if (nwritten == 0) + return -EINTR; + } #ifdef DEBUG_IO kprintf("Process::sys$write: nwritten=%u\n", nwritten); #endif diff --git a/Kernel/Process.h b/Kernel/Process.h index 52a9e25b2e..9716c218fc 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -52,6 +52,7 @@ public: BlockedSleep, BlockedWait, BlockedRead, + BlockedSignal, }; enum RingLevel { @@ -64,7 +65,7 @@ public: bool is_blocked() const { - return m_state == BlockedSleep || m_state == BlockedWait || m_state == BlockedRead; + return m_state == BlockedSleep || m_state == BlockedWait || m_state == BlockedRead || m_state == BlockedSignal; } PageDirectory& page_directory() { return *m_page_directory; } @@ -317,6 +318,7 @@ static inline const char* toString(Process::State state) case Process::BlockedSleep: return "Sleep"; case Process::BlockedWait: return "Wait"; case Process::BlockedRead: return "Read"; + case Process::BlockedSignal: return "Signal"; case Process::BeingInspected: return "Inspect"; } ASSERT_NOT_REACHED();