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 :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
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
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 88Excusez 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.
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
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
Partager