Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
freebsd:enchanger_deux_descripteurs_de_fichier_au_runtime [2008/02/27 18:22]
sbz
freebsd:enchanger_deux_descripteurs_de_fichier_au_runtime [2010/01/12 13:29] (current)
Line 1: Line 1:
 +Ce tips vous permettra de savoir comment échanger la sortie de deux descripteurs de fichier sous Linux et sous FreeBSD, l'​exemple sera fait ici avec un simple /bin/cat.
  
 +Nota: sous FreeBSD, il est nécessaire de monter procfs via la commande suivante :
 +<​code>​
 +% sudo mount -t procfs procfs /proc
 +</​code>​
 +
 +====== 1/ Lancer la commande ======
 +<​code>​
 +% cat > /tmp/foo1
 +</​code>​
 +
 +
 +====== 2/ Récupérer le process id ======
 +
 +Ici, l'​utilisateur en question est sbz, changer le pour mettre le vôtre
 +<​code>​
 +% ps aux -U sbz | head -n1 ; ps aux -U sbz | grep cat
 +USER   PID %CPU %MEM   ​VSZ ​  ​RSS ​ TT  STAT STARTED ​     TIME COMMAND
 +sbz   ​1891 ​ 0,0  0,2  3140   ​820 ​ p3  S+   ​17:​34 ​    ​0:​00,​00 cat
 +</​code>​
 +
 +====== 3/ Contrôler que le descripteur de fichier est bien ouvert ======
 +<​code>​
 +% ls -la /proc/1891/
 +total 0
 +...
 +lr--r--r-- ​ 1 sbz   ​wheel ​ 0 27 fév 17:34 file -> /bin/cat
 +...
 +-r--r--r-- ​ 1 sbz   ​wheel ​ 0 27 fév 17:34 status
 +</​code>​
 +
 +
 +
 +====== 4/ Changer le descripteur de fichier /tmp/foo1 par /tmp/foo3 au runtime ======
 +
 +Ici, on utilisera gdb pour débuger le process id 1891, fermera son descripteur d'​entrée (stdout) ​
 +pour ouvrir un nouveau descripteur pour son entrée.
 +
 +Ceux sont tout simplement les utilisations des appels systèmes close(2) et creat(2) [note on aurait trés bien pu aussi utiliser open(2) avec le flag O_CREAT ]
 +
 +<​code>​
 +% gdb -p 1891 /bin/cat
 +GNU gdb 6.1.1 [FreeBSD]
 +Copyright 2004 Free Software Foundation, Inc.
 +GDB is free software, covered by the GNU General Public License, and you are
 +welcome to change it and/or distribute copies of it under certain conditions.
 +Type "show copying"​ to see the conditions.
 +There is absolutely no warranty for GDB.  Type "show warranty"​ for details.
 +This GDB was configured as "​i386-marcel-freebsd"​...(no debugging symbols found)...
 +Attaching to program: /bin/cat, process 1891
 +Reading symbols from /​lib/​libc.so.7...(no debugging symbols found)...done.
 +Loaded symbols for /​lib/​libc.so.7
 +Reading symbols from /​libexec/​ld-elf.so.1...(no debugging symbols found)...done.
 +Loaded symbols for /​libexec/​ld-elf.so.1
 +0x2815d4a1 in read () from /​lib/​libc.so.7
 +(gdb) p close(1)
 +$1 = 0
 +(gdb) p creat("/​tmp/​foo3",​0600)
 +$2 = 1
 +(gdb) q
 +The program is running. ​ Quit anyway (and detach it)? (y or n) y
 +Detaching from program: /bin/cat, process 1891
 +</​code>​
 +
 +===== 5/ Ecrire dans notre descripteur ​ ======
 +Il suffit de reprendre la commande cat lancée plus haut, et d'​écrire ce que l'on souhaite dedans
 +<​code>​
 +% cat > /tmp/foo1
 +I love the swap beetween 2 files descriptors
 +witch gdb :)
 +</​code>​
 +
 +
 +====== 6/ Constater notre échange de descripteur a marché ​ ======
 +<​code>​
 +% cat /tmp/foo3
 +I love the swap beetween 2 files descriptor
 +witch gdb :)
 +</​code>​
 +
 +Je tiens à préciser que cette méthode en aucun cas n'a été trouvé par moi, je suis juste la personne qui francise cela et l'​adapte pour FreeBSD, voici la véritable ​ [[http://​etbe.coker.com.au/​2008/​02/​27/​redirecting-output-from-a-running-process/​|source]] pastée par gaston sur le chan.
freebsd/enchanger_deux_descripteurs_de_fichier_au_runtime.txt · Last modified: 2010/01/12 13:29 (external edit)