2011-12-16 3 views
1

J'essaye d'écrire un shell pour Linux en C et/ou en C++. Quelles fonctions dois-je utiliser pour interagir avec le noyau? Quelqu'un a dit d'utiliser system(), mais je pense qu'il appelle le shell, ce qui entraînerait une récursion infinie. Quelqu'un d'autre a dit quelque chose à propos de fork() et exec().Interaction noyau-noyau

De toute évidence, un bon shell a besoin d'un moyen d'accéder au système de fichiers. Je suppose que le noyau fournit une interface quelconque pour cela, n'est-ce pas? Comment devrais-je lire la sortie du noyau? Est-ce du texte ou des entiers?

Y at-il un endroit où je peux trouver une bonne documentation sur les fonctions nécessaires? Y a-t-il une page man particulière ou un fichier de code source que je devrais lire?

+0

Vous pouvez également étudier le code source de coques simples simples, par ex. écharpe –

Répondre

5

Le noyau fournit un ensemble d '«appels système» pour l'exécution de processus de bas niveau et l'accès au système de fichiers. L'exécution du processus est généralement effectuée en utilisant fork() et l'un des exec() family calls. E/S peut être fait avec des appels tels que open(), stat(), opendir(), etc.

Une liste de la plupart des appels plus portables (à la fois bibliothèque C et appels système) se trouve au Open Group Base Specification (cliquez sur « système interfaces »). Il y en a aussi qui sont spécifiques à Linux - ceux qui sont destinés à un usage ordinaire seront documentés dans la section 2 des pages de manuel (ls /usr/share/doc/man/man2 ou man 2 somefunction).

+0

+1 pour la documentation. C'est très utile. Je vous remercie. –

3

Un bon point de départ est un manuel sur les systèmes d'exploitation. Je recommanderais le "dinosaur book" par Silberschatz et al. Une autre bonne ressource est la page de classe du professeur Dave Hollinger à RPI pour son cours sur les systèmes d'exploitation. Les diapositives sont en ligne, y compris une conférence sur l'écriture d'un shell. Il y a aussi une tâche à faire sur l'écriture d'un shell de base que vous pouvez vérifier.

http://cgi2.cs.rpi.edu/~hollingd/opsys/opsys.php

Un shell est un programme très complexe qui ne peut pas vraiment être décrit dans une réponse StackOverflow. Cependant, ces ressources devraient vous orienter dans la bonne direction.

+0

Ces ressources semblent utiles. Il y a aussi une autre ressource éducative à [http://icarus.cs.weber.edu/~dab/cs3100.html](http://icarus.cs.weber.edu/~dab/cs3100.html) –

0

d'abord tout ce que vous devez savoir ce que toutes les fonctionnalités du shell existant fournit:

1. executables Forker et les exécuter.

2. Un interpréteur, pour les scripts shell.

3. Peu de commandes intégrées comme cd etc ..

4. Et bien d'autres things..I suggère de lire certains UNIX OS livre

Si vous venez voulez exécuter des commandes dans votre nouveau shell .. alors vous devez juste fork et exécuter (ou vous pouvez le faire enfiler) les exécutables déjà existants à "/ bin", "/ usr/bin" etc.

Si juste un projet passe-temps, je vous recommande d'utiliser le module Python

+0

Pourquoi utiliser Python quand je connais déjà C et C++? –

+0

Google et vous trouverez beaucoup de choses intéressantes .. Faites-moi confiance :) – Arunmu

1

La liste des system calls compris par le linux kernel est documenté dans la page de manuel syscalls(2).

Un shell ne s'interface généralement pas à tous. Un shell est généralement le plus concerné par les appels système impactant les processus qu'il peut exécuter. Par exemple, un shell n'a généralement pas besoin d'appeler (par lui-même) les appels système mmap ou mprotect (même si l'implémentation de malloc appelle probablement mmap).