Bonjour à tous, (et en particulier à matafan et souviron34 [bonjour presque voisin de Béziers] qui m'ont répondu plusieurs fois de façon qui m'a fait progresser)
dans ce post d'hier (http://www.developpez.net/forums/d65...nel-virtuelle/) j'annonçais que la machine sun fire 68000 sous sunOS 5.8 sur laquelle je bosse et qui amène à mon entendement toutes les questions qui viennent n'allait bientôt plus être à ma disposition; or il est de l'ordre du possible que ce ne soit pas aussi immédiat que je le craignais. Donc disons que je voudrais changer la valeur du membre cr_uid de la structure cred attachée à la cmdtool (shell dans un fenêtre autonome) que j'ai créée par fork en tant que fille d'un programme en C. [qui s'appelle fcmdt comme Fork et CMDTool] (il est bien évident que si j'arrive un jour à modifier ce terme qui donne ses droits à ma shell, je ne ferai pas de bêtises puisque ce serait comme scier la branche sur laquelle je suis assis pour travailler gentiment)(mais cela m'impose d'apprendre plein de choses que d'essayer, alors que dix sept ans du même boulot ne me font plus tellement apprendre de nouveauté)

Donc je lance mon petit programme, et il me dit un peu ce qui se passe; le fils, qui lance la cmdtool, intervient dans les deux avant-dernières lignes, avant que le père ne réponde à la commande ps, ce qui donne "l'adresse virtuelle kernel" de la structure "proc" attachée à la cmdtool-fille. Je ne sais toujours pas ce que c'est malgré une question chez Solaris http://www.developpez.net/forums/d65...nel-virtuelle/ , mais cette adresse est le début de la structure "proc" attachée à la cmdtool-fille, et un membre de cette structure est un pointeur vers la structure cred qui donne les droits à la cmdtool, et donc à la shell qu'elle met à l'écran :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 $ ./fcmdt
 
pere:  getpid()=22860
pere: pid_child=22865
fils:  getpid()=22865
fils: getppid()=22860
pere: cmd=/usr/bin/ps -o user,pid,addr,args -p 22865 |grep moi |awk '{print $3}'
30035a54a90
Une fois que le programme m'a rendu la main, il y a un nouvelle shell créee par la cmdtool à l'écran, et je peux avoir son PID puis voir les résultats des commmandes pmap ou pstack la concernant, mais comment les interpréter ? Je devine que ça cause de choses qui se passent dans la mémoire, mais puis je en déduire mon adresse de la structure proc puis de la cred ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
$ ps -u moi | grep cmdt
 22865 pts/931  0:00 fcmdt
 22869 ??       0:00 cmdtool
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ pmap 22869
 
28072:  /usr/openwin/bin/cmdtool
00010000      8K read/exec         /usr/openwin/bin/cmdtool
00020000     16K read/write/exec   /usr/openwin/bin/cmdtool
00024000    256K read/write/exec     [ heap ]
FEE80000    688K read/exec         /usr/lib/libc.so.1
FEF3C000     32K read/write/exec   /usr/lib/libc.so.1
FEF80000    568K read/exec         /usr/lib/libnsl.so.1
FF01E000     40K read/write/exec   /usr/lib/libnsl.so.1
FF028000     24K read/write/exec   /usr/lib/libnsl.so.1
FF060000     16K read/exec         /usr/lib/libmp.so.2
FF074000      8K read/write/exec   /usr/lib/libmp.so.2
FF080000    552K read/exec         /usr/openwin/lib/libX11.so.4
FF11A000     24K read/write/exec   /usr/openwin/lib/libX11.so.4
FF130000      8K read/write/exec     [ anon ]
FF140000     96K read/exec         /usr/openwin/lib/libXext.so.0
FF168000      8K read/write/exec   /usr/openwin/lib/libXext.so.0
FF170000      8K read/exec         /usr/platform/sun4u-us3/lib/libc_psr.so.1
FF180000     40K read/exec         /usr/lib/libsocket.so.1
FF19A000      8K read/write/exec   /usr/lib/libsocket.so.1
FF1A0000      8K read/write/exec     [ anon ]
FF1B0000      8K read/write/exec   /usr/lib/libdl.so.1
FF1C0000      8K read/exec         /usr/lib/libintl.so.1
FF1D0000     56K read/exec         /usr/openwin/lib/libolgx.so.3
FF1EC000      8K read/write/exec   /usr/openwin/lib/libolgx.so.3
FF200000   1424K read/exec         /usr/openwin/lib/libxview.so.3
FF372000     56K read/write/exec   /usr/openwin/lib/libxview.so.3
FF380000      8K read/write/exec   /usr/openwin/lib/libxview.so.3
FF390000      8K read/exec         /usr/lib/libw.so.1
FF3A0000    176K read/exec         /usr/lib/ld.so.1
FF3DC000      8K read/write/exec   /usr/lib/ld.so.1
FF3DE000      8K read/write/exec   /usr/lib/ld.so.1
FFBCE000    136K read/write          [ stack ]
 total     4312K
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//     -l    (pmap only) Print unresolved dynamic linker map names.
$ pmap -l 22869
22869:  ./fcmdt
00010000      8K read/exec         fcmdt
00020000      8K read/write/exec   fcmdt
FF280000    688K read/exec         /usr/lib/libc.so.1
FF33C000     32K read/write/exec   /usr/lib/libc.so.1
FF370000      8K read/write/exec     [ anon ]
FF380000      8K read/write/exec   /usr/lib/libdl.so.1
FF390000      8K read/exec         /usr/platform/SUNW,Sun-Fire/lib/libc_psr.so.1
FF3A0000    176K read/exec         /usr/lib/ld.so.1
FF3DC000      8K read/write/exec   /usr/lib/ld.so.1
FF3DE000      8K read/write/exec   /usr/lib/ld.so.1
FFBEC000     16K read/write          [ stack ]
 total      968K
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 //     -r    (pmap only) Print the process's reserved addresses.
$ pmap -r 22869
22869:  ./fcmdt
00010000      8K read/exec         /home/st13277/S/C/TMP/fcmdt
00020000      8K read/write/exec   /home/st13277/S/C/TMP/fcmdt
FF280000    688K read/exec         /usr/lib/libc.so.1
FF33C000     32K read/write/exec   /usr/lib/libc.so.1
FF370000      8K read/write/exec     [ anon ]
FF380000      8K read/write/exec   /usr/lib/libdl.so.1
FF390000      8K read/exec         /usr/platform/sun4u-us3/lib/libc_psr.so.1
FF3A0000    176K read/exec         /usr/lib/ld.so.1
FF3DC000      8K read/write/exec   /usr/lib/ld.so.1
FF3DE000      8K read/write/exec   /usr/lib/ld.so.1
FF3F0000   8192K read/write          [ stack ]
 total     9144K
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 //     -x    (pmap  only)  Print  resident/shared/private mapping details.
$ pmap -x 22869
22869:  ./fcmdt
 Address   Kbytes Resident Shared Private Permissions       Mapped File
00010000       8       8       8       - read/exec         fcmdt
00020000       8       8       -       8 read/write/exec   fcmdt
FF280000     688     688     688       - read/exec         libc.so.1
FF33C000      32      32       -      32 read/write/exec   libc.so.1
FF370000       8       8       -       8 read/write/exec     [ anon ]
FF380000       8       8       -       8 read/write/exec   libdl.so.1
FF390000       8       8       8       - read/exec         libc_psr.so.1
FF3A0000     176     176     176       - read/exec         ld.so.1
FF3DC000       8       8       -       8 read/write/exec   ld.so.1
FF3DE000       8       8       -       8 read/write/exec   ld.so.1
FFBEC000      16      16       -      16 read/write          [ stack ]
--------  ------  ------  ------  ------
total Kb     968     968     880      88
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 $ pstack 22869
22869:  ./fcmdt
 ff31fa30 waitid   (0, 6da6, ffbee720, 103)
 ff2d6c74 _waitpid (0, ffbee80c, 100, ffbee80c, 21e7c, ff314f38) + 60
 ff314f4c system   (20b48, ff340284, ff343a54, 0, 220f8, 1078c) + 25c
 00010800 main     (1, ffbeeb5c, ffbeeb64, 20800, 0, 0) + 80
 00010758 _start   (0, 0, 0, 0, 0, 0) + 108
Excusez moi que ce post soit particulièrement illisible, mais j'ai passé une bonne partie de la journée dans les manpages à essayer de trouver comment interpreter les commandes "pchose PID", hébin à part pcred qui est évident, j'aimerais savoir ce que représentent les sorties de pmap et pstack.
David qui a besoin d'aide; j'hésite à ajouter mon code qui n'est pas long, mais si quelqu'un a lu jusqu'ici, il peut bien poursuivre un peu et voir la grande lumière blanche que lui feront apparaître les lignes suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 //
// cc fcmdt.c -go fcmdt
// ./fcmdt 
//
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
main(int argc, char* argv[]) { 
char cmd[256];
int child;
child=fork();
printf("\n");
if(child==0) { // ici le fils
    printf("fils:  getpid()=%d\n", getpid());
    printf("fils: getppid()=%d\n", getppid());
    system("/usr/openwin/bin/cmdtool 2> /dev/null"); }
else if(child==-1) { // ici err. ds le fork
    perror("fork"); }
else { // ici le père
    printf("pere:  getpid()=%d\n", getpid());
    printf("pere: pid_child=%d\n", child);
    sprintf(cmd,"/usr/bin/ps -o user,pid,addr,args -p %d |grep st13277 |awk '{print $3}'\n", child);
    printf("pere: cmd=%s", cmd);
    system(cmd); } }
//
// cc fcmdt.c -go fcmdt
// ./fcmdt