On Mon, Apr 09, 2001 at 02:52:41PM -0500, Robert Hentosh wrote:
> I have been playing with aolserver on OpenBSD 2.8. aolserver 3.3.1
> now compiles cleanly on OpenBSD. And searching through the mailling
> lists the only other problem seems to be an issue with tcl exec command.
>
> I have tried an exec from a tcl script and from an ADP and have
> confirmed the problem.
>
> an ADP with the following in it:
>
> <% ps_puts [exec /bin/ls] %>
>
> fails with the following in the log:
>
> Error: error reading output from command: interrupted system call
> while executing
> "exec /bin/ls"
>
> This works on my redhat7.0 box. I also tried OpenBSD-snapshot
> (from Apr 08) with the same results. nsd76 has the same issue also.
>
> The log message seems to be generated from a failed call to
> Tcl_ReadChars() within the procedure Tcl_ExecObjCmd() contained i
> n tcl8.3.2/generic/tclIOCmd.c.
>
> This is the first time I have dug into aolserver's code. So any
> pointers/solutions/hunches would be most appreciated.
I have traced this a little more. Using GDB and stepping through
Tcl_ReadChars after Tcl_ExecObjCmd is called allows it to complete without
resulting in the error.
Using ktrace on the nsd8x process and it seems that the read() from the
pipe to the fork'd process is receiving SIGCHLD:
6481 nsd8x CALL fstat(0x10,0x1a5aec)
6481 nsd8x RET fstat 0
6481 nsd8x CALL close(0x10)
6481 nsd8x RET close 0
6481 nsd8x CALL read(0xe,0x1ca020,0x1000)
6481 nsd8x GIO fd 14 read 65 bytes
"bin
include
lib
log
modules
nsd8x.core
sample-config.tcl
servers
"
6481 nsd8x RET read 65/0x41
6481 nsd8x CALL read(0xe,0x1ca020,0x1000)
6481 nsd8x PSIG SIGCHLD caught handler=0x4018b9b8 mask=0x0 code=0x0
6481 nsd8x RET read -1 errno 4 Interrupted system call
6481 nsd8x CALL fcntl(0,0x4,0x4)
6481 nsd8x RET fcntl -1 errno 19 Operation not supported by device
6481 nsd8x CALL fcntl(0x1,0x4,0x6)
6481 nsd8x RET fcntl 0
So it looks like to me that the read() at line 953 in tclUnixPipe.c is
getting the SIGCHLD on the second read() after it has obtained the
program output. I am not sure what the proper solution should be.
Suggestions?