À l'aide de execl pour exécuter une commande Linux
J'ai besoin de lister tous les fichiers dans le répertoire courant qui ont une autorisation de 644 par l'écriture d'un programme en langage C qui.
Je ne peux pas utiliser system()
et utiliser execl()
afin d'utiliser les appels système.
Cette ligne que j'ai utilisé dans mon code:
execl("/usr/bin/find", "find . -maxdepth 1 -perm 644", (char *)NULL);
Le problème est que le code est à la recherche de l'ensemble du disque au lieu du répertoire courant.
Pourriez-vous m'aider à le résoudre s'il vous plaît?
...
case 4:
int status;
switch (fork()){
case -1: quit ("fork",1);
case 0:
execl("/usr/bin/find","find","." ,"-maxdepth" ,"1","-perm", "644",(char *)NULL) ;
exit (200);
default:
wait(&status);
exit(0);
}
}
OriginalL'auteur femchi | 2012-11-22
Vous devez vous connecter pour publier un commentaire.
Séparer les arguments:
Votre invocation est équivalent à l'invocation de la
find
programme sans arguments (et très drôleargv[0]
).J'avais besoin de voir ton code pour comprendre ce que tu veux dire. Êtes-vous à l'aide de
fork()
etwait()
trop? Quelque chose d'autre? Modifier votre question, n'essayez pas de le mettre dans un commentaire. Et de ne pas détruire la question d'origine (et toutes mes excuses si je vous dis ce que vous connaissez déjà).Le problème est que lorsque vous utilisez
execl()
, vous remplacez le processus actuel par un nouveau. Ainsi, lorsque vous choisissez l'option 4, vous remplacez votre menu de programme avecfind
, et lorsque lefind
s'arrête, le réel de la coquille est de retour dans les affaires — votre programme s'est suicidé, si vous le souhaitez, quand il a remplacé lui-même avecfind
. (C'est un très morbide d'affaires, de traiter avec les processus enfants qui meurent sur vous.) Si vous avez besoin pour exécuter lefind
de la commande et continuez votre programme, utilisezfork()
et exécuterfind
de l'enfant etwait()
pour l'enfant à effectuer dans le parent.Et c'est exactement la raison pour éviter de frai avec
fork()/execl()
si possibleVous êtes à la re-revu le code pour le "cas 4:" est presque correct; vous ne voulez pas faire
exit(0);
dans ledefault:
(toutbreak
). Vous voulez que votre programme pour continuer. (Leexit(200)
après l'échec de l'execl()
est très important.)OriginalL'auteur Jonathan Leffler
OriginalL'auteur alinsoar
Pour votre tâche particulière, à l'aide de l'arborescence des fichiers de marche (
ftw
) est plus approprié.ftw est juste une bibliothèque, de sorte que vous n'avez pas besoin de spawn externe processus pour obtenir le travail fait. Aussi, il est beaucoup plus facile à analyser les résultats.
OriginalL'auteur mvp