Salut à tous,
j'ai un problème, j'aimerai écrire la liste des processus d'un utilisateur dans un fichier et recuperer aléatoirement deux de ces numeros. je suis bloqué au niveau de la création du fichier. J'utilise le code suivant:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
/* Liste des arguments passés à l'appel system execvp*/
char* arg_list[] = {
"ps", /* nom du programme.*/
"-u",
"gadiri", //nom d'un utilisateur
"-o",
"pid",
"--no-headers",
">id_proc.txt", /* redirection vers le fichier où je veux mettre les resultats */
};
/*Le processus courant execute l'appel system qui va executer
la commande ps en lui passant arg_list*/
execvp("ps", arg_list) ;
return 0;
}
ce programme compile mais n'exécute pas, je pense que c'est du à la redirection, mais je ne vois pas comment proceder autrement. Si qcqu'un peut m'aider je lui en serai très reconnaissant
merci
gadiri
# Utiliser un shell
Posté par Pascal Terjan (site web personnel) . Évalué à 2.
Pourquoi passer par un programme en C pour faire ça ?
[^] # Re: Utiliser un shell
Posté par gadiri . Évalué à 1.
merci encore pour l'aide
[^] # Re: Utiliser un shell
Posté par gc (site web personnel) . Évalué à 2.
# J'ai réussi à l'exécuter,
Posté par Gyro Gearllose . Évalué à 1.
"ps", /* nom du programme.*/
en
"/bin/ps", /*nom du programme.*/
Et en changeant la liste des options :
">id_proc.txt", /* redirection vers le fichier où je veux mettre les resultats */
};
est devenu :
">id_proc.txt", /* redirection vers le fichier où je veux mettre les resultats */
NULL
};
En effet, la page de man des fonctions exec indique :
"The list of arguments must be terminated by a NULL pointe"
Pour autant, ça ne donne pas le résultat escompté puisque le >id_proc.txt est compris pas la commande ps comme une option, et on se retrouve à l'exécution de l'affichage de l'aide de base de la commande ps. Aux gourous de faire mieux, ça me dépasse, pour l'instant (le coup de récupérer la sortie standard, je ne sais pas trop non plus comment faire).
Une autre piste serait peut-être d'exploiter le répertoire /proc, non ?
# Youpla tu a lu trop vite mon gars
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 5.
Donc soit tu fait un script shell, ce qui soit dit en passant serait bien plus logique qu'un programme en C,
soit tu fait un script shell que tu passe en parametre a un shell (ex via bash -e) dans ton programme C (encore plus ridicule que le programme en C),
soit tu utilise une librairie genre libgtop ou autre si tu a vraiment besoin de code en C ce dont je doute,
soit tu utilise les appels systemes directement pour faire cela.
[^] # Re: Youpla tu a lu trop vite mon gars
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 3.
[^] # Re: Youpla tu a lu trop vite mon gars
Posté par Troy McClure (site web personnel) . Évalué à 4.
list = glibtop_get_proclist(buf, GLIBTOP_KERN_PROC_UID, getpwnam("toto")->pw_uid);
[^] # Re: Youpla tu a lu trop vite mon gars
Posté par gadiri . Évalué à 1.
# System
Posté par Christophe Chailloleau-Leclerc . Évalué à 2.
(cf. http://www.rt.com/man/system.3.html(...))
system("ps -u gadiri -o pid --no-headers > id_proc.txt");
Simplissime, non ?
La seule contrainte, c'est de ne pas le faire dans un programme multi-thread, car ce n'est pas une fonction sûre...
Euh, éventuellement, il faudra préciser les chemins complets, pour ps et pour ton fichier... A tester !
@++
[^] # Re: System
Posté par gadiri . Évalué à 1.
merci
a+
[^] # Re: System
Posté par Guillaume Knispel . Évalué à 2.
Ce qui est vraiment lourd vu l'effet recherché !
La "bonne" méthode serait surrement de faire un fork puis de closer la sortie standard (handle 1) et de la rouvrir en utilisant le fichier de sortie, puis de faire un exec. (c'est ce que le shell fait après avoir parsé la commande)
[^] # Re: System
Posté par CoinKoin . Évalué à 2.
[^] # Re: System
Posté par CoinKoin . Évalué à 2.
[^] # Re: System
Posté par gadiri . Évalué à 1.
[^] # Re: System
Posté par gadiri . Évalué à 1.
[^] # Re: System
Posté par CoinKoin . Évalué à 2.
Pas besoin de malloc! A mon avis, le code que je t'ai donné est "sale", c'est-à-dire qu'il n'est pas codé proprement (par exemple, le chemin "/proc" ne devrait pas s'y trouver en dur, mais faire l'objet d'un #define, lui aussi), mais il est parfaitement fonctionnel.
En revanche, il faut que tu effectues les #include nécessaires, et je pense que c'est ça que tu as oublié. Ces #include sont décrits en détail en haut des pages de "man" correspondant aux appels système employés, ici stat() (et sprintf(), même si ce n'est pas un vrai appel-système).
"man 2 stat" donne :
("man 2 stat", parce que man stat, c'est juste pour la commande shell "stat").
Pour sprintf, il faut sans doute ajouter #include <stdio.h> , et peut-être #include <string.h> (je n'ai pas de man 3 installé, actuellement, or sprintf est décrite dans une page de la section 3 du man, donc je ne suis pas sûr).
Sache aussi que ces #include doivent être placés au tout début de ton fichier.
En conclusion, si tu es débutant en C, sache que les pages de man, man 2 et man 3 surtout, sont particulièrement utiles à la programmation dans ce langage. Même si leur lecture, au début, est fastidieuse...
[^] # Re: System
Posté par gadiri . Évalué à 1.
a+
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.