J'étais en train de lire sur les appels système et je me demandais si une commande pouvait être exécutée sans même un seul appel système. Si non, quelle est la commande avec le nombre minimum d'appels système? J'ai utilisé strace
pour certaines commandes, mais la liste est longue. Quelqu'un peut-il me dire une telle commande?
/bin/true
et /bin/false
devraient être les commandes préinstallées avec le moins d'appels système.
Vous pouvez enregistrer certains appels système en établissant un lien statique:
Enregistrez les éléments suivants sous la forme, par exemple. minimal.c
int main() {
return 0;
}
et compiler en utilisant
gcc --static -o minimal minimal.c
Cela vous donnera le programme minimal
dans votre dossier de travail actuel.
Parlant de ce que les appels système sont réellement exécutés afin de "exécuter" ("exécuter" donc interprétés dans une acceptation plus large que l'acceptation dont vous faites probablement allusion), un programme, non: pour un, le execve()
syscall est toujours exécuté juste pour exécuter la commande (dans ce cas, je pense qu'il vaut mieux parler d'exécutable) lui-même, et le exit()
syscall est toujours exécuté au retour de main()
:
le compilateur C passe un appel à exit () après le retour de main ()
( Source )
Pour répondre à votre question, qui est dépendante de l’exécutable et donc très large: comme preuve de concept, vous déclarez que tout exécutable réellement utile utilisera au moins un appel système, il vaut la peine de préciser que, pour un, exit()
il est très probable que syscall soit exécuté à partir du programme lui-même en cas d'erreur; sans oublier que tout exécutable ouvrant/fermant un descripteur de fichier utilisera les appels système open()
/close()
.
En fin de compte, dans toute commande réellement utile, il y aura très probablement au moins un appel système (par exemple, tel que exit()
si le programme rencontre une erreur lors de l'exécution et/ou open()
/close()
si la commande doit lire un fichier que ce soit).
Les appels système sont le seul moyen pour le programme de communiquer avec le monde extérieur, y compris pour annoncer qu'il est terminé.
Ainsi, un programme qui n’utilise aucun appel système n’a aucun effet observable, il ne peut ni arrêter ni abandonner le processeur, et doit donc fonctionner à tout jamais avec une puissance de processeur maximale. Pas très utile.
Oui. Quelques commandes s’exécutent sans faire d’appel système.
Une condition préalable à de telles commandes est qu’elles soient intégrées au shell (bash
, pour mon système). Cela élimine à la fois le temps système nécessaire à l'installation (un certain nombre d'appels système effectués par l'éditeur de liens et libc pour configurer l'environnement pour l'exécution du code) et l'appel éventuel exit ().
strace
ne vous aidera pas à identifier ces commandes, car ce ne sont pas des programmes réels. Aucun fichier ne correspond aux commandes intégrées, et donc si strace
est-ce que Pour trouver la commande, ce sera une version externe, complète avec la configuration et la suppression de tout processus.
La commande bash
help
répertorie toutes les commandes internes disponibles. Notez que beaucoup d’entre eux font également des appels système. Certains qui ne pas utiliser les appels système:
function
for
declare
true
(la version intégrée; pas /bin/true
)false
(la version intégrée; pas /bin/false
)shift
set
case
alias
/unalias
set
/unset
En général ... si une commande est interne au shell, ne lit aucune entrée, n'écrit aucune sortie et ne fonctionne qu'avec des variables en mémoire, elle n'utilise probablement pas d'appels système.
Il n'y a pas grand-chose qu'un programme puisse faire de manière significative sans passer aucun appel système. Les appels système constituent la principale méthode par laquelle un programme communique avec tout ce qui ne fait pas partie du programme.
La communication via des fichiers mappés en mémoire ou la mémoire partagée est possible, mais des appels système sont toujours nécessaires pour l’établir. Ensuite, il peut être utilisé pour communiquer sans autre appel système.
Un programme peut recevoir des informations de l'extérieur par le biais de signaux. Mais si aucun gestionnaire de signal n'est installé, le signal tuerait simplement le programme, et l'installation du gestionnaire de signal nécessite un appel système. En principe, un programme doit également effectuer un appel système à la fin du traitement du signal reçu, mais si le signal était configuré pour ne pas bloquer les signaux lors de la réception, quitter le gestionnaire de signaux pourrait alors être effectué sans appel système. C'est plus une curiosité qu'une technique significative avec des applications réelles.
Un programme qui ne passe aucun appel système consomme tout le temps CPU qu'il peut obtenir car dormir (dans la plupart des cas) nécessite un appel système. Un programme peut être en veille car il attend que les pages mappées soient chargées à partir du disque. Mais sans appels système, les seules pages mappées à charger seraient l'exécutable lui-même, qui serait bientôt mis en cache.
Lorsque vous exécutez le programme, vous pouvez afficher des résultats partiels pour d’autres programmes en modifiant ses propres variables de ligne de commande ou d’environnement. Ceux-ci peuvent être modifiés sans appel système.
Même une terminaison normale d'un programme implique un appel système. Mais un programme peut déclencher un signal pour se terminer sans appel système. Les signaux qui pourraient éventuellement être déclenchés incluent SIGILL, SIGBUS, SIGFPE, SIGSEGV.
Compte tenu de tout cela, il serait possible d'écrire un programme qui, une fois démarré, effectuerait des calculs sur les valeurs fournies sur la ligne de commande et se terminerait par un signal différent en fonction du résultat de ce calcul. Ce n'est pas le moyen le plus utile d'indiquer le résultat d'un calcul, mais c'est certainement possible.