Bonjour,

J'ai un projet à faire et ça fait longtemps que je cherche sur internet mais je trouve pas comment procéder pour le résoudre (vu que je débute en programmation système ).
Est-ce que vous pouvez me donnez quelques astuces qui me permettent d'avancer.
Merci.

Sujet:
Il s'agit de réaliser un analogue de la commande pstree(1), qui est souvent présente sous forme d'extension sur les Unix et Linux-like.

On désirerait un programme qui prenne en paramètre le nom d'un utilisateur, et affiche la liste de tous les processus appartenant à cet utilisateur sous forme hiérarchique, en faisant apparaitre clairement les relations parent-enfant.
  • On lance le programme sous la forme mypstree toto.
  • On se retrouve avec tous les processus lancés par tot.
  • L'affichage doit se faire directement dans le terminal. On peut utiliser les caractères |, -, +, pour obtenir un semblant de graphique.


Contraintes techniques:

  • Il n'y a pas de manière standard d'obtenir la liste des processus au niveau appels systèmes. La seule solution raisonnable consiste à lire la sortie de la commande ps(1), appelée avec les bonnes options. Ce projet vise à vérifier que vous savez utiliser des pipes, merci de ne pas essayer de faire autrement.
  • On considère que les pids sont limités à 65536, ce qui permet de construire simplement un tableau de pointeurs de structures.
  • On veut toute la généalogie des processus lancés par l'utilisateur, ce qui veut dire également les ancêtres ou descendants qui peuvent éventuellement tourner sous une autre identité. On distinguera ces processus par un process(user).
  • Le programme doit être rédigé en C.
  • Il y a une difficulté algorithmique pour savoir exactement quels processus afficher. Il faudra sans doute faire un ou plusieurs parcours d'arbre pour savoir quoi faire.
Ma solution:
Mon idée consiste à afficher tous les processus de tous les utilisateurs en utilisant ps -eo "%p %P %c %U" ensuite filtrer le résultat à l'aide du grep pour afficher que les processus du l'utilisateur demandé.

ps -e : Pour afficher tous les processus de tous les utilisateurs.
ps- o "%p %P %c %U" : Afficher que les colonnes PID, PPID, Commande et Utilisateur.

ps -e -o "%p %P %c %U" | grep User : la commande grep prend le résultat de la commande ps comme entré puis ensuite en utilisant le pipe, faire filtrer ce résultat suivant le user demandé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
char*s1="ps -eo \"%p %P %c %U\" | grep ";
char*s2=argv[1];
char*s3=(char*)malloc((strlen(s1)+strlen(s2)+1)*sizeof(char));
strcat(s3,s1);
strcat(s3,s2);
system(s3);
return 0;
}