IRC Logs for #lost


2021-02-05

05:22:15 Biolunar joined the channel
08:09:18 XanClic joined the channel
09:02:58 kevin joined the channel
14:11:03 XanClic: Ich hab doch hier C-Experten
14:11:11 xq: ieh!
14:11:26 XanClic: und Expertinnen
14:11:28 XanClic: mein Fehler
14:11:45 XanClic: https://gist.github.com/XanClic/841f1406643fd191dcafdd36449bfbf5
14:11:59 XanClic: wenn ich das mit -std=gnu11 kompiliere, kommt da ($pid, 0) raus
14:12:13 XanClic: wenn ich das mit -std=c11 kompiliere, kommt einerseits eine Warnung, dass kill() nicht definiert sei, und andererseits kommt EAGAIN raus
14:12:35 XanClic: eigentlich hab ich auch EAGAIN erwartet, weil ein Signal eigentlich das waitpid() genau so unterbrechen sollte, aber offensichtlich passiert das mit gnu11 nicht
14:16:07 xq: du rufst eine andere funktion auf
14:16:15 xq: dir fehlt ein #include
14:16:23 XanClic: Eigentlich nicht
14:16:25 XanClic: ist doch ganz oben
14:16:32 xq: WAT
14:16:42 XanClic: signal.h definiert kill() nur mit __USE_POSIX
14:16:48 XanClic: was von gnu11 impliziert wird
14:17:04 xq: https://c.godbolt.org/z/cKsKab
14:17:26 xq: das diff sind
14:17:33 xq: call __sysv_signal
14:17:35 xq: statt
14:17:36 xq: call signal
14:17:37 xq: und
14:17:43 xq: irgendwo in xor eax, eax
14:17:45 xq: *ein
14:17:52 XanClic: Disassembly ist eine gute Idee
14:18:41 XanClic: Bei mir hab ich nur den __sysv_signal-Unterschied
14:18:53 XanClic: Das ist ja interessant. Wieso sollte das einen Unterschied machen, wie der Handler installiert wird?
14:19:10 xq: gute frage
14:19:22 XanClic: probier ich mal sigaction oder so
14:20:26 XanClic: Schade, das geht mit -std=c11 gleich gar nicht mehr, weil die struct sigaction halt nicht definiert ist… :/
14:23:40 XanClic: https://gist.github.com/XanClic/841f1406643fd191dcafdd36449bfbf5
14:23:54 XanClic: so, mit sigaction() und _POSIX_C_SOURCE macht das jetzt bei beidem EAGAIN
14:24:02 XanClic: das ist irgendwie schön, aber irgendwie erklärt das immer noch nicht so ganz alles
14:28:17 XanClic: > However, sysv_signal() provides the System V unreliable signal semantics, that is: […] c) if the handler interrupts (certain) blocking system calls, then the system call is not automatically restarted.
14:28:24 XanClic: Aha!
14:29:27 XanClic: Der Unterschied ist also .sa_flags = SA_RESTART beim sigaction() oder nicht
14:29:28 xq: what :D
14:29:42 XanClic: Mit Restart wird waitpid() wohl automatisch neugestartet und dann kommt kein EAGAIN
15:14:07 kevin: Wie wird das denn implementiert? Hat der Kernel da ein Trampolin, wohin das ret im Signalhandler hinspringt und das dann wieder irgendwie den Kernel aufruft?
15:15:01 XanClic: Alles, was ich in der letzten Dreiviertelstunde gelernt hab, ist, dass das Verhalten dank PEP 475 nicht in Python replizierbar ist
15:15:58 XanClic: da wollte ich das nämlich eigentlich haben, damit ich gleichzeitig darauf warten kann, dass ein Kindprozess beendet wird (waitpid), und auf Signale warten kann (waitpid bricht mit EAGAIN) ab; aber dummerweise ruft Python viele Syscalls einfach in einer Loop auf, bis da nicht mehr EAGAIN zurückkommt
15:16:19 XanClic: So einfach wirds im Kernel vermutlich nicht sein, aber ich kann ja da auch mal nachgucken, ist ja Day of Learning *g*
15:26:53 XanClic: regs->ax = regs->orig_ax;
15:26:55 XanClic: regs->ip -= 2;
15:26:58 XanClic: das sieht ja einfach richtig kaputt aus
15:27:34 XanClic: wenn ich mich nicht irre, ist das wirklich alles
15:33:52 XanClic: Was für ein Glück, dass int 0x80, syscall und sysenter alle zwei Bytes lang sinmd
15:33:53 XanClic: *sind
21:41:21 Paddy joined the channel