Enrico Scholz <enrico.scholz(a)wirtschaft.tu-chemnitz.de> writes:
I can not find anything about setting signals in the X11 strace.
See my comments below... on the suspect ioctls. I still think it could
be some symbolversioning problem. The main change glibc 2.1 made was
in the FILE * structure. In this case the open() call is done by the X
libraries (which I assume were not recompiled with glibc 2.1), but
XEmacs is doing the F_SETSIG stuff which is only supported if you
opened the file with the new open.
Or maybe it is something else altogether (it would be interesting to
find out if these two failing ioctl's (see below) are indeed the code
in request_sigio_on_device. Maybe you can set a breakpoint on that
function to see which settings XEmacs does? Then we can compare this
with a glibc 2.0 build.
Here is your trace, annotated by me. I am learning by doing here so
please correct me if I am writing gibberish.
execve("/usr/bin/xemacs", ["xemacs", "-vanilla",
"-eval", "(call-process \"sleep\" nil nil nil
\"3\")"], [/* 41 vars */]) = 0
brk(0) = 0x839e000
[... init code]
socket(PF_UNIX, SOCK_STREAM, 0) = 11
uname({sys="Linux", node="ultra.csn.tu-chemnitz.de", ...}) = 0
uname({sys="Linux", node="ultra.csn.tu-chemnitz.de", ...}) = 0
connect(11, {sun_family=AF_UNIX, sun_path="/tmp/.X11-unix/X0"}, 19) = 0
[open up the X connection...]
uname({sys="Linux", node="ultra.csn.tu-chemnitz.de", ...}) = 0
fcntl(11, F_SETFD, FD_CLOEXEC) = 0
access("/home/ensc/.Xauthority", R_OK) = 0
open("/home/ensc/.Xauthority", O_RDONLY) = 12
[...]
close(12) = 0
[..]
write(11, "\20\1\6\0\20\0\0\0SCREEN_RESOURC"..., 24) = 24
read(11, "\1\0\10\0\0\0\0\0T\0\0\0\0\0\0\0"..., 32) = 32
write(11, "\24\0\6\0%\0\0\0T\0\0\0\37\0\0\0"..., 24) = 24
[..]
read(11, "\1\0\t\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 32) = 32
read(11, "\1\2=\0\4\0\0\0\270\317P\10\0\0\0"..., 32) = 32
readv(11, [{"2>B\0%m@qM\0t\0suN\0", 16}, {"", 0}], 2) = 16
fcntl(11, F_GETOWN) = 0
getpid() = 2285
fcntl(11, F_SETOWN, 2285) = 0
ioctl(11, 0x7, 0xbfffef38) = -1 EINVAL (Invalid argument)
ioctl(11, 0x6, 0x4) = -1 EINVAL (Invalid argument)
This seems suspect to me.... It does look suspiciously like
ioctl (filedesc, I_GETSIG, &events);
ioctl (filedesc, I_SETSIG, events | S_INPUT);
from sysdep.c (The solaris manpage says this what you need to do there
to get a signal on input). Could you grep the glibc2.1
include files to compare the definition of
I_GETSIG, I_SETSIG, S_INPUT with 0x7, 0x6, and 0x4 ?
[...]
write(11, "-\0\17\0\t\0\200\5/\0AR-*-courie"..., 68) = 68
getdents(12, /* 0 entries */, 3933) = 0
close(12) = 0
stat("/bin/sleep", {st_mode=0, st_size=0, ...}) = 0
access("/bin/sleep", X_OK) = 0
open("/dev/null", O_RDONLY) = 12
pipe([13, 14]) = 0
fork() = 2286
close(14) = 0
close(12) = 0
close(14) = -1 EBADF (Bad file descriptor)
lseek(13, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
read(13, "", 512) = 0
--- SIGCHLD (Der Kind-Prozeß ist beendet) ---
write(10, "\0", 1) = 1