Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2862 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [C/API] [résolu] démarrer un terminal comme enfant d'un autre logiciel

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C/API] [résolu] démarrer un terminal comme enfant d'un autre logiciel

n°1445330
rat de com​bat
attention rongeur méchant!
Posté le 07-03-2020 à 15:18:42  profilanswer
 

Bonjour,
 
oui je sais, le titre est cryptique. :o  
 
Je maîtrise le C et je sais utiliser un terminal sous Linux mais tout ce qui touche à l'API de Linux/UNIX/POSIX/bidule j'y connais rien.
 
En bref: Si je tappe p.ex. geany dans un terminal j'ai ce logiciel qui démarre. Si je ferme ma fenêtre terminal j'ai Geany qui se ferme aussi. Si je comprends bien c'est parce que Geany est démarré comme "enfant" (child) du terminal.
Par contre si je tappe x-terminal-emulator j'ai bien un autre terminal qui s'ouvre, mais cette fois si je ferme le premier terminal le second que je viens de démarrer reste ouvert. Je veux qu'il se ferme aussi. Comment faire?
 
Toute l'histoire:
Je veux pouvoir ouvrir un terminal depuis un code C, mais comme "enfant" pour que à la fin du programme écrit en C le terminal se referme aussi. Si j'utilise system("x-terminal-emulator" ); cela ne fonctionne pas. J'ai tenté un fork() et mis le system() dans la partie child mais cela ne marche pas non plus.
 
Je suppose que x-terminal-emulator fait exprès de se détacher(?) du processus duquel il est appellé, mais justement cela m'embête, comment le changer? A priori il n'y a pas moyen de prendre un processus et de l'attacher comme enfant à un autre si j'ai bien cherché?
 
Bref. C'est clair? :o


Message édité par rat de combat le 21-03-2020 à 15:07:03
mood
Publicité
Posté le 07-03-2020 à 15:18:42  profilanswer
 

n°1445333
kajoux
Posté le 07-03-2020 à 17:44:30  profilanswer
 

Oui, c'est clair, mais je sais pas trop si tu peux empêcher le processus fils de s'autonomiser dans le cas d'un terminal…
Par contre, ce que tu dois pouvoir faire, c'est récupérer le pid du terminal et le killer à la fin de ton programme C.

n°1445360
Anonymouse
Posté le 08-03-2020 à 22:05:10  profilanswer
 

Si le processus fils geany se ferme lorsque le terminal se termine c'est parce qu'il reçoit un signal SIGHUP envoyé par le terminal et que le handler par défaut du signal SIGHUP pour geany termine le processus qui le reçoit.
 
https://en.wikipedia.org/wiki/SIGHUP
 
If a command is executed inside a terminal window and the terminal window is closed while the command process is still running, it receives SIGHUP
 
Si tu démarres geany avec le programme nohup qui masque le signal SIGHUP " nohup geany &" tu observes que lorsque le terminal père meurt le fils reste vivant.
 
A noter qu'il y'a une subtilité : le terminal n'envoie pas de signal SIGHUP à tous ses fils systématiquement lorsqu'il se termine. Lorsque tu clos le terminal (avec la croix) le terminal va alors recevoir un signal SIGHUP qu'il va lui même le retransmettre à ses fils avant de se terminer.
 
Mais si tu termine le terminal père sans lui envoyer un signal SIGHUP (par exemple en tapant la commande exit dans le terminal) le terminal n'envoie pas de signaux SIGHUP à ses fils. Exemple tu démarres "geany &" et que tu termines le terminal père avec la commande "exit".
 
Dans ton cas je suppose que le terminal créé par le père masque aussi le signal SIGHUP raison pour laquelle le fils reste. J'ai pas réussi à confirmer cette hypothèse via strace.
 
Solution 1: faire comme dit kajoux : récupérer le pid du fils et kill manuel lorsque le père se termine
 
Solution 2: plus robuste mais plus complexe : http://man7.org/linux/man-pages/ma [...] ces.7.html
 
"PID namespaces isolate the process ID number space, meaning that processes in different PID namespaces can have the same PID."
 
 The first process created in a new namespace (i.e., the process created using clone(2) with the  CLONE_NEWPID flag, or the first child created by a process after a call to unshare(2) using the CLONE_NEWPID flag) has the PID 1, and is the "init" process for the namespace (see init(1)).
 
If the "init" process of a PID namespace terminates, the kernel terminates all of the processes in the namespace via a SIGKILL signal.


Message édité par Anonymouse le 08-03-2020 à 22:28:27
n°1445769
rat de com​bat
attention rongeur méchant!
Posté le 20-03-2020 à 19:22:19  profilanswer
 

Merci. C'est compliqué cette histoire. :pt1cable:  
 
Ce que je ne comprends pas actuellement: Si j'exécute x-terminal-emulator depuis un terminal j'en ai deux à la fin, mais si je regarde le résultat de ps -ef je ne vois qu'un seul qui a deux enfants bash. Euh??? Je m'attendais à voir deux xfce4-terminal avec chacun un bash en child.
 

$ ps -ef
...
xxx 22019  1020  0 19:14 tty1     00:00:00 xfce4-terminal
...
 
$ x-terminal-emulator
 
$ ps -ef
...
xxx 22019  1020  0 19:14 tty1     00:00:00 xfce4-terminal
xxx 22023 22019  0 19:15 pts/0    00:00:00 bash
xxx 22171 22019  0 19:17 pts/1    00:00:00 bash
...


 
Je ne sais pas si ça a un rapport avec mon problème mais si quelqu'un pourrait m'expliquer cette chose... Je vois des "pts", j'avais déjà vu ça quelque part, je vais creuser...
 
Pour info, sur mon système (Debian 10) /usr/bin/x-terminal-emulator est un lien vers /etc/alternatives/x-terminal-emulator qui est un script Perl qui démarre xfce4-terminal.

n°1445773
kajoux
Posté le 21-03-2020 à 02:12:48  profilanswer
 

La commande xfce4-terminal ne lance pas une nouvelle instance, seulement une nouvelle fenêtre.
Pour lancer une nouvelle instance, tu peux faire

xfce4-terminal --disable-server

n°1445789
rat de com​bat
attention rongeur méchant!
Posté le 21-03-2020 à 15:06:38  profilanswer
 

Merci!! J'aurais dû lire le manpage. :o
 
Du coup quand on utilise ta commande le child se ferme quand on ferme le parent (désolé pour le mélange de langues)...
 
 :jap:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [C/API] [résolu] démarrer un terminal comme enfant d'un autre logiciel

 

Sujets relatifs
Mon serveur refuse de demarrer[tomcat]Déployer mais ne pas démarrer les webapps
Logiciel videotheque linux mintOS / logiciel NAS?
Debian - Caractères s'inserant seuls dans le terminal[résolu] Impossible de démarrer Windows après installation d'Ubuntu
Les Journées du Logiciel Libre ont besoin de vous !Démarrer le serveur automatiquement au reboot de la machine.
Logiciel récupération données 
Plus de sujets relatifs à : [C/API] [résolu] démarrer un terminal comme enfant d'un autre logiciel


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR