Hallo,
Am Thu, 21 Apr 2005, Heinz W. Pahlke schrieb:
On 21-Apr-2005 Thomas Klopf wrote:
[..]
Also wir wissen:
- Öffnen von /usr/X11R6/lib/X11/fonts/Type1/UTBI____.pfa klappt
- Die Fontdatei wird auch in den Speicher gemappt.
- Das Schliessen der Fontdatei klappt.
Ach so, das "2357 SYS_close(7)" bezieht sich also darauf.
Jep. Die '7' ist der Filedescriptor (fd). Siehe den Rueckgabewert des
SYS_open() auf 'UTBI____.pfa'.
Und ich dachte, es koennte evtl. an der Font-Datei liegen.
Das ist meine Vermutung. Denn die Datei ist ja noch im Zugriff per
MMap, da es noch kein 'munmap' auf die Speicheradresse gab, die mmap
zurueckgegeben hat. [1]
Sind wir sicher dass das Folgende korrekt ist ?
- Der Zugriff auf die gemappten Daten führt zu einem Seg Fault.
Sicher ? Nein, ich bin mir da nicht sicher.
Mich macht halt noch die Zeile vor dem Segfault stutzig:
1259 FT_Get_Postscript_Name(0x085ecb80, 0xbfffeb10, 0xbfffeb00, 1,
0x402f052c
Das war aber mit der vorher installierten Scribus-Version. Mit der
scribus-1.2.1-1.0suse91 gibt es diese Meldung ja nicht mehr.
Aber nachdem ich jetzt mal nach unfinished gesucht habe: die Meldung
taucht einige Dutzend Male auf.
Das mit dem gibt's immer dann, wenn eine (nicht libc-)
Bibliotheksfunktion zu syscalls wechselt. Z.B:
XOpenDisplay(... 0x080495fc
SYS_...
[..]
SYS_...
<... XOpenDisplay resumed> ) = 0x080496f0
-dnh
[1] Zum Nachvollziehen:
dh@slarty[4]: /tmp/test8 (0)$ ls -lA
total 4
-rw-r--r-- 1 dh dh 793 Apr 21 18:21 mmap-test.c
dh@slarty[4]: /tmp/test8 (0)$ cat mmap-test.c
#include
#include
#include
#include
#include
#include
int main(void) {
int fd;
void * ptr;
fd = open("foo", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR );
if( fd < 0) { perror(""); exit(errno); }
if( write(fd, "abc\n", 4) != 4 ) { close(fd); perror(""); exit(errno); }
if( close(fd) != 0 ) { perror(""); exit(errno); }
fd = open("foo", O_RDONLY);
if( fd < 0) { perror(""); exit(errno); }
ptr = mmap(NULL, 512, PROT_READ, MAP_PRIVATE, fd, 0);
if( ptr == MAP_FAILED ) { close(fd); perror(""); exit(errno); }
if( close(fd) != 0 ) { perror(""); exit(errno); }
if( write(1, ptr, 4) != 4 ) { perror(""); }
if( munmap(ptr, 512) != 0 ) { perror(""); exit(errno); }
return 0;
}
dh@slarty[4]: /tmp/test8 (0)$ gcc -Wall -W -o mmap-test mmap-test.c
dh@slarty[4]: /tmp/test8 (0)$ ./mmap-test
abc
dh@slarty[4]: /tmp/test8 (0)$ hex < foo
00000000 61 62 63 0A abc.
dh@slarty[4]: /tmp/test8 (0)$ rm foo
dh@slarty[4]: /tmp/test8 (0)$ unset LANG LD_LIBRARY_PATH
dh@slarty[4]: /tmp/test8 (0)$ ltrace -S -s 128 ./mmap-test
[.. Initkram bis inkl. "__register_frame_info" geloescht ..]
SYS_open("foo", 65, 0600) = 4
SYS_write(4, "abc\n", 4) = 4
SYS_close(4) = 0
[Das sind die ersten 4 Zeilen: open(2), write(2), close(2) (die Zahlen
sind die Sektionen der manpages).]
SYS_open("foo", 0, 04) = 4
SYS_mmap(0xbfffe7f4, 0, 0x40107618, 0x4000aa20, 0xbfffe894) = 0x40014000
SYS_close(4) = 0
[open(2), mmap(2), close(2). Die Datei wurde also erfolgreich geoeffnet,
mmapped und geschlossen(!).]
SYS_write(1, "abc\n", 4abc
) = 4
[Und huch, was ist das? Das ist das "write(1, ptr, 4);" samt Ausgabe.
Obwohl also Datei per close(fd) geschlossen wurde ist sie nach wie vor
ueber den Speicherbereich in den sie ge-mmap-ed wurde ansprechbar.]
SYS_munmap(0x40014000, 512) = 0
[und das abschliessende munmap(2).]
__deregister_frame_info(0x08049830, 0xbfffe82c, 0x08049930, 0x08048254, 0x4002dbac) = 0x0804994c
SYS_exit(0) = <void>
+++ exited (status 0) +++
dh@slarty[4]: /tmp/test8 (0)$
--
Es ist eine Gabe derer die Nichts anderes Kenn, das was sie da die
Dummheit nennen.
Und jeder, auch der es nich Mag
Bekommt davon was , jeden Tag. [WoKo in dag°]