iotjs
iotjs copied to clipboard
IoT.js unexpectedly exits (caused by SIGPIPE) when the active socket is closed by the client
build:
./tools/build.py --jerry-heaplimit=2048 --jerry-profile=es2015-subset
Test code: test.js
var fs = require("fs")
var http = require("http")
var port = 8888
http.createServer(function(request, response) {
console.log("Request for path: " + request.url)
fs.createReadStream("/tmp/100M.bin").pipe(response)
})
.listen(port, function() {
console.log('HTTP server listening on port: ' + port)
})
#prepeare the file
dd if=/dev/urandom of=/tmp/100M.bin bs=1M count=100
#on the server-side
gdb iotjs/build/x86_64-linux/debug/bin/iotjs
run test.js
#on the client-side
wget -O - localhost:8888 | pv -L 10k > /dev/null
#after a few second, press ctrl + c (close connection)
#GDB result:
Thread 1 "iotjs" received signal SIGPIPE, Broken pipe.
__libc_write (nbytes=4096, buf=0x8157e8, fd=7) at ../sysdeps/unix/sysv/linux/write.c:26
26 ../sysdeps/unix/sysv/linux/write.c: No such file or directory.
(gdb) where
#0 __libc_write (nbytes=4096, buf=0x8157e8, fd=7) at ../sysdeps/unix/sysv/linux/write.c:26
#1 __libc_write (fd=7, buf=0x8157e8, nbytes=4096) at ../sysdeps/unix/sysv/linux/write.c:24
#2 0x000000000059f6fb in uv__write (stream=0x804d80) at /tmp/iotjs/deps/libtuv/src/unix/stream.c:854
#3 0x00000000005a0861 in uv__stream_io (loop=0x803a00 <default_loop_struct>, w=0x804df0, events=29) at /tmp/iotjs/deps/libtuv/src/unix/stream.c:1334
#4 0x00000000005a5477 in uv__io_poll (loop=0x803a00 <default_loop_struct>, timeout=117805) at /tmp/iotjs/deps/libtuv/src/unix/linux-core.c:389
#5 0x0000000000598c9c in uv_run (loop=0x803a00 <default_loop_struct>, mode=UV_RUN_ONCE) at /tmp/iotjs/deps/libtuv/src/unix/core.c:327
#6 0x00000000004200a6 in iotjs_start (env=0x602700 <current_env>) at /tmp/iotjs/src/iotjs.c:233
#7 0x0000000000420386 in iotjs_entry (argc=2, argv=0x7fffffffe368) at /tmp/iotjs/src/iotjs.c:312
#8 0x000000000041fb12 in main (argc=2, argv=0x7fffffffe368) at /tmp/iotjs/src/platform/linux/iotjs_linux.c:19
Possible solution somewhere in main thread:
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, NULL);
thank you so much! it's work