Je lance d'abord la commande cat > foo1
dans une session et tester que les données de stdin sont copiées dans le fichier. Puis, dans une autre session, je redirige la sortie.
Tout d'abord, trouvez le PID du processus :
$ ps aux | grep cat
rjc 6760 0.0 0.0 1580 376 pts/5 S+ 15:31 0:00 cat
Maintenant, vérifiez les poignées de fichiers qu'il a ouvertes :
$ ls -l /proc/6760/fd
total 3
lrwx—— 1 rjc rjc 64 Feb 27 15:32 0 -> /dev/pts/5
l-wx—— 1 rjc rjc 64 Feb 27 15:32 1 -> /tmp/foo1
lrwx—— 1 rjc rjc 64 Feb 27 15:32 2 -> /dev/pts/5
Maintenant, lancez GDB :
$ gdb -p 6760 /bin/cat
GNU gdb 6.4.90-debian
[license stuff snipped]
Attaching to program: /bin/cat, process 6760
[snip other stuff that's not interesting now]
(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 6760
El p
dans GDB imprimera la valeur d'une expression, une expression peut être une fonction à appeler, un appel système J'exécute donc une commande close()
appel système et passe le handle de fichier 1, puis j'exécute un creat()
appel système pour ouvrir un nouveau fichier. Le résultat de l'appel creat()
était 1, ce qui signifie qu'il a remplacé l'ancien gestionnaire de fichier. Si je voulais utiliser le même fichier pour stdout et stderr ou si je voulais remplacer un handle de fichier par un autre nombre, je devrais appeler la fonction dup2()
pour obtenir ce résultat.
Pour cet exemple, j'ai choisi d'utiliser creat()
au lieu de open()
parce qu'il y a moins de paramètres. Les macros C pour les drapeaux ne sont pas utilisables depuis GDB (il n'utilise pas les en-têtes C) donc je devrais lire les fichiers d'en-tête pour découvrir cela - ce n'est pas si difficile à faire mais cela prendrait plus de temps. Notez que 0600 est la permission octale pour le propriétaire ayant un accès en lecture/écriture et le groupe et les autres n'ayant aucun accès. Il est également possible d'utiliser 0 pour ce paramètre et d'exécuter chmod sur le fichier plus tard.
Après cela, je vérifie le résultat :
ls -l /proc/6760/fd/
total 3
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 0 -> /dev/pts/5
l-wx—— 1 rjc rjc 64 2008-02-27 15:32 1 -> /tmp/foo3 <====
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5
Saisir plus de données dans cat
résulte dans le fichier /tmp/foo3
étant annexé.
Si vous voulez fermer la session originale, vous devez fermer tous les gestionnaires de fichiers, ouvrir un nouveau périphérique qui peut être le tty de contrôle, et ensuite appeler setsid()
.
2 votes
SO n'est probablement pas optimal pour ces questions. Je pense que le SU est le meilleur, bien que le SF puisse avoir une meilleure chance d'y répondre. Ma meilleure compréhension, BTW : essayez
disown
si cela échoue, vous n'avez pas de chance.1 votes
Vous voulez probablement dire > où vous avez écrit |. Les deux côtés d'un pipe doivent être exécutables. Si vous redirigez vers un fichier ou un périphérique (tel que /dev/null), vous utilisez > et <.
0 votes
stackoverflow.com/questions/249703/ stackoverflow.com/questions/682783/
1 votes
reptyr
0 votes
Je sais que c'est une solution de contournement mais vous pouvez aussi faire
shopt huponexit
déconnexion et connexion,