Comment puis-je implémenter mon propre shell unix de base dans C?

Je suis un débutant pour traiter et gérer les threads. Mon shell doit comprendre la variable d’environnement PATH . Il peut être défini et modifié. Il fonctionne de deux manières: mode interactif et batch. Shell est capable de prendre plus d’un travail comme le fichier ls; ps; wc; cal. Je veux aussi me salir les signaux. Je devrais donc gérer ^ K, ^ c aussi.

Je sais que je vais devoir utiliser des frameworks, des fourches et des tuyaux, mais je ne peux tout simplement pas commencer.

Tous les shells Unix sont open-source – un bon sharepoint départ peut être de lire le code.

Si vous cherchez un bon article de base sur le sujet, essayez Writing Your Own Shell de la Linux Gazette.

Un autre bon sharepoint départ est de jeter un coup d’œil au code source de la mini-shell simplement parce que c’est l’un des plus petits.

Votre boucle principale est:

  • lire une ligne (utiliser fgets(3) pour un simple shell, readline(3) pour un simple)
  • parsingr la commande
  • fourche et exécute les pipelines

Pour parsingr la commande, il existe deux choix courants. Écrivez un parsingur de descente récursif ou utilisez yacc(1) pour en générer un. Il est beaucoup plus facile de taper un parsingur initial à l’aide de yacc , mais vous pouvez totalement le bloquer et vous voulez vraiment qu’il soit sans contexte. Je préfère la descente récursive mais à peu près tout le monde préfère utiliser yacc. (Techniquement, le bison .) Si le shell est vraiment très simple, comme un devoir, yacc peut être excessif.

Pour faire l’parsing lexicale, vous pouvez également effectuer votre propre parsing ou utiliser le flex.

Vous n’aurez pas besoin d’utiliser de threads.

De nombreux livres Unix décrivant les principaux appels système implémentent également un shell pour illustrer comment et pourquoi vous pouvez utiliser les différents appels. Stevens et Rochkind sont deux de ces livres:

  • W Richard Stevens, Stephen Une programmation avancée de Rago dans l’environnement Unix, 3ème édition

  • Marc J Rochkind Programmation avancée Unix, 2e édition