Hi, On 2024-03-22 10:22:03 -0400, Ryan Raymond wrote: > Hello, all > I have a problem with my web-server. > If the network connection to the server is closed (by killing the client) > and one attempts to write data to that port in GUILE, the interpreter will > exit without an error message. echo "$?" says GUILE exited with error code > 141 but google doesn't give any results for this. > > This code is running in a separate thread so it shouldn't be causing the > main thread to die. > Wrapping the write in a try-catch doesn't work. Maybe a bug with the C? > It only happens on the second write though. > > It is reproducible. Run this code as a guile script: > > (define sock (socket PF_INET SOCK_STREAM 0)) > (bind sock AF_INET INADDR_LOOPBACK 8081) > (listen sock 100) > (define c (car (accept sock))) > (sleep 5) > ; Start curl and then cancel here > (display "I am a banana" c) > (display "Banana also, lol" c) > (display "I should run if this doesn't fail\n") > > In another terminal run > curl localhost:8081 --http0.9 Thank you for nice and short reproduction steps :) > > Make sure to cancel curl and then type echo $? to see the error code 141. > Any help would be welcome, thanks This seems to be caused by SIGPIPE. When running your repro under GDB: Thread 1 "guile" received signal SIGPIPE, Broken pipe. 0x00007ffff7a150af in write () from /gnu/store/ln6hxqjvz6m9gdd9s97pivlqck7hzs99-glibc-2.35/lib/libc.so.6 (gdb) bt #0 0x00007ffff7a150af in write () from /gnu/store/ln6hxqjvz6m9gdd9s97pivlqck7hzs99-glibc-2.35/lib/libc.so.6 #1 0x00007ffff7ed286f in fport_write (port=, src=, start=, count=16) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/fports.c:623 #2 0x00007ffff7f0ef44 in scm_i_write_bytes (port=# 7ffff779a160>, src="#" = {...}, start=0, count=16) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/ports.c:2858 #3 0x00007ffff7f10f01 in scm_c_put_latin1_chars (port=# 7ffff779a160>, chars=, len=16) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/ports.c:3458 #4 0x00007ffff7f166ef in iprin1 (exp="Banana also, lol", port=# 7ffff779a160>, pstate=0x7ffff778c4d8) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/print.c:687 #5 0x00007ffff7f1693a in scm_iprin1 (exp=, port=, pstate=) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/print.c:561 #6 0x00007ffff7f16b0d in scm_prin1 (exp="Banana also, lol", port=# 7ffff779a160>, writingp=0) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/print.c:840 #7 0x00007ffff7f16cbf in scm_display (obj="Banana also, lol", port=# 7ffff779a160>) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/print.c:1114 #8 0x00007ffff7f43390 in vm_regular_engine (thread=0x7ffff767dd80) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/vm-engine.c:972 #9 0x00007ffff7f50db5 in scm_call_n (proc=, argv=, nargs=1) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/vm.c:1615 #10 0x00007ffff7ebb977 in scm_primitive_eval (exp=, exp@entry=((@ (ice-9 control) %) (begin ((@@ (ice-9 command-line) load/lang) "/tmp/x.scm") (quit)))) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/eval.c:671 #11 0x00007ffff7ec1846 in scm_eval (exp=((@ (ice-9 control) %) (begin ((@@ (ice-9 command-line) load/lang) "/tmp/x.scm") (quit))), module_or_state="#" = {...}) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/eval.c:705 #12 0x00007ffff7f203e6 in scm_shell (argc=3, argv=0x7fffffffda88) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/script.c:357 #13 0x00007ffff7ed28cc in invoke_main_func (body_data=0x7fffffffd920) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/init.c:312 #14 0x00007ffff7eb9e1a in c_body (d=0x7fffffffd840) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/continuations.c:430 #15 0x00007ffff7f43390 in vm_regular_engine (thread=0x7ffff767dd80) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/vm-engine.c:972 #16 0x00007ffff7f50db5 in scm_call_n (proc=, argv=, nargs=2) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/vm.c:1615 #17 0x00007ffff7ebb5ca in scm_call_2 (proc=, arg1=, arg2=) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/eval.c:503 #18 0x00007ffff7f62092 in scm_c_with_exception_handler.constprop.0 (type=#t, handler_data=handler_data@entry=0x7fffffffd7d0, thunk_data=thunk_data@entry=0x7fffffffd7d0, thunk=, handler=) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/exceptions.c:170 #19 0x00007ffff7f3de1f in scm_c_catch (tag=, body=, body_data=, handler=, handler_data=, pre_unwind_handler=, pre_unwind_handler_data=0x7ffff76fd500) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/throw.c:168 #20 0x00007ffff7ebc396 in scm_i_with_continuation_barrier (pre_unwind_handler=0x7ffff7ebc0b0 , pre_unwind_handler_data=0x7ffff76fd500, handler_data=0x7fffffffd840, handler=0x7ffff7ec2ba0 , body_data=0x7fffffffd840, body=0x7ffff7eb9e10 ) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/continuations.c:368 #21 scm_c_with_continuation_barrier (func=, data=) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/continuations.c:464 #22 0x00007ffff7f3d049 in with_guile (base=0x7fffffffd8c8, data=0x7fffffffd8f0) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/threads.c:649 #23 0x00007ffff7e207fa in GC_call_with_stack_base () from /gnu/store/k1ha4n9v8d7myiiszvl2ic7xnb56l219-libgc-8.2.2/lib/libgc.so.1 #24 0x00007ffff7f373f8 in scm_i_with_guile (dynamic_state=, data=, func=) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/threads.c:692 #25 scm_with_guile (func=, data=) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/threads.c:698 #26 0x00007ffff7edb8e5 in scm_boot_guile (argc=argc@entry=3, argv=argv@entry=0x7fffffffda88, main_func=main_func@entry=0x401240 , closure=closure@entry=0x0) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/init.c:295 #27 0x00000000004010f7 in main (argc=3, argv=0x7fffffffda88) at /tmp/guix-build-guile-3.0.9.drv-0/guile-3.0.9/libguile/guile.c:94 If you check module/web/server/http.scm in the guile's repository, you will notice there is this line: (sigaction SIGPIPE SIG_IGN) Which caused the signal to be ignored instead of using the default handler (which is to die). Have a nice day, Tomas Volf -- There are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors.