Création/recouvrement de processus (2)

Recouvrement de processus

xterm(1)

Utiliser la page de manuel de xterm(1) pour exécuter une commande dans la fenêtre terminal et maintenir la fenêtre ouverte la fin de l'exécution de cette commande.

Recouvrement

Écrire un programme creerterm cŕeant une fenêtre terminal à l'aide de la commande xterm.  Il est inutile d'utiliser fork(). Il ne faut évidemment pas utiliser ici les fonctions system() ou popen() !

Avec une commande

Modifier le programme précédent pour exécuter dans cette fenêtre terminal la commande passée en premier paramètre.  La fenêtre devra rester ouverte à la fin de la commande.

Prise d'identité (question facultative)

Reprendre le programme précédent et utiliser le bit de prise d'identité pour créer une fenêtre terminal exécutant un shell interactif avec les privilèges de root.

Remarques :

  • Pour répondre à cette question, il faut pouvoir passer root. Ce n'est donc pas possible sur les machines de l'IUT.
  • La commande xterm est un peu particulière et commence, pour des raisons de sécurité, à réinitialiser l'UID effectif à l'UID réel. Pour contourner cela, il suffit, avant d'exécuter la commande, de mettre l'UID réel égal à l'UID effectif par un appel à setuid(geteuid()).

Fonction system()

Le but de l'exercice est de réécrire la fonction standard system(), qui permet d'exécuter une commande shell.  Son prototype est le suivant:

int system(const char *command);

Description

La fonction system() exécute la commande indiquée dans le paramètre command en appelant /bin/sh -c command , et revient après l'exécution complète de la commande. Durant cette exécution, les signaux SIGINT et SIGQUIT sont ignorés.

Valeur de retour

La valeur de retour de system() est une des valeurs suivantes :

  • Si command vaut NULL, une valeur diff'erente de zéro est retournée.
  • Si un processus fils n'a pas pu être créé, ou si son état n'€™a pas pu être récupéré, la valeur de retour est -1.
  • Si un shell n'a pas pu être exécuté dans le processus fils, alors la valeur de retour est identique à  ce qu'€™elle serait si le shell s'était terminé par un appel à  _exit(127).
  • Si aucun appel système n'a échoué, alors la valeur de retour est l'état du processus fils, tel que renvoyé par waitpid().

Donnez, en langage C, une implémentation possible de la fonction system() qui respecte entièrement les spécifications ci-dessus.

Pour tester...