{"record":{"id":"a7187fef9db35cb4","repo":"kovidgoyal/kitty","slug":"call-to-read-from-read-signals-failed-with-err","errorCode":null,"errorMessage":"Call to read() from read_signals() failed with error: %s","messagePattern":"Call to read\\(\\) from read_signals\\(\\) failed with error: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"kitty/loop-utils.c","lineNumber":149,"sourceCode":"            if (errno == EINTR) continue;\n            if (!in_signal_handler) log_error(\"Failed to write to %s wakeup fd with error: %s\", loop_name, strerror(errno));\n        }\n        break;\n    }\n}\n\n\nvoid\nread_signals(int fd, handle_signal_func callback, void *data) {\n#ifdef HAS_SIGNAL_FD\n    static struct signalfd_siginfo fdsi[32];\n    siginfo_t si;\n    while (true) {\n        ssize_t s = read(fd, &fdsi, sizeof(fdsi));\n        if (s < 0) {\n            if (errno == EINTR) continue;\n            if (errno == EAGAIN) break;\n            log_error(\"Call to read() from read_signals() failed with error: %s\", strerror(errno));\n            break;\n        }\n        if (s == 0) break;\n        size_t num_signals = s / sizeof(struct signalfd_siginfo);\n        if (num_signals == 0 || num_signals * sizeof(struct signalfd_siginfo) != (size_t)s) {\n            log_error(\"Incomplete signal read from signalfd\");\n            break;\n        }\n        for (size_t i = 0; i < num_signals; i++) {\n            si.si_signo = fdsi[i].ssi_signo;\n            si.si_code = fdsi[i].ssi_code;\n            si.si_pid = fdsi[i].ssi_pid;\n            si.si_uid = fdsi[i].ssi_uid;\n            si.si_addr = (void *)(uintptr_t)fdsi[i].ssi_addr;\n            si.si_status = fdsi[i].ssi_status;\n            si.si_value.sival_int = fdsi[i].ssi_int;\n            if (!callback(&si, data)) break;\n        }","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kitty/loop-utils.c#L131-L167","documentation":"The signalfd read in read_signals failed with an error other than EINTR/EAGAIN, so the signal-processing pass stops for this iteration; signals may be processed on a later loop iteration.","triggerScenarios":"read() on the signalfd fd failing with EBADF/EINVAL etc. - typically the fd was closed concurrently during shutdown.","commonSituations":"Benign shutdown races between the io loop thread and the main thread on Linux.","solutions":["Ignore if it appears only at exit","Upgrade kitty","Report upstream with a reproduction if it happens during normal operation"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Ignore at shutdown; report persistent occurrences upstream"],"tags":["kitty","signalfd","event-loop","linux"],"backgroundTag":"fd-read-failed","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}