{"id":25957626,"url":"https://github.com/samyb2/jsh-sys","last_synced_at":"2026-05-16T06:38:12.063Z","repository":{"id":279784677,"uuid":"939963424","full_name":"SamyB2/JSH-SYS","owner":"SamyB2","description":null,"archived":false,"fork":false,"pushed_at":"2025-02-27T11:54:55.000Z","size":28,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-27T16:23:03.404Z","etag":null,"topics":["c","jobs","multiprocessing","parsing","shell"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SamyB2.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-27T11:51:41.000Z","updated_at":"2025-02-27T11:54:59.000Z","dependencies_parsed_at":"2025-02-27T16:32:22.217Z","dependency_job_id":"3abfb4ea-24f3-4b50-ba05-14448d13f9b1","html_url":"https://github.com/SamyB2/JSH-SYS","commit_stats":null,"previous_names":["samyb2/jsh-sys"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/SamyB2/JSH-SYS","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamyB2%2FJSH-SYS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamyB2%2FJSH-SYS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamyB2%2FJSH-SYS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamyB2%2FJSH-SYS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SamyB2","download_url":"https://codeload.github.com/SamyB2/JSH-SYS/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamyB2%2FJSH-SYS/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273060143,"owners_count":25038593,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-31T02:00:09.071Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","jobs","multiprocessing","parsing","shell"],"created_at":"2025-03-04T17:35:54.438Z","updated_at":"2026-05-16T06:38:12.015Z","avatar_url":"https://github.com/SamyB2.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Architecture de jsh\n\n## Introduction\nCe document décrit l'architecture du projet `jsh`, un interpréteur de commandes (aka shell) interactif reprenant quelques fonctionnalités classiques des shells usuels, en particulier la gestion des tâches lancées depuis le shell. Outre la possibilité d'exécuter toutes les commandes externes, `jsh` propose quelques commandes internes, permet la redirection des flots standard ainsi que les combinaisons par tube, et adapter le prompt à la situation.\n\n## Structure du Projet\nLe projet est organisé en dossiers et fichiers de manière à séparer les en-têtes des fichiers source. Voici la structure de haut niveau:\n\n- `head/` : Contient les fichiers d'en-tête du projet.\n- `src/` : Contient les fichiers source C qui implémentent les fonctionnalités du shell.\n\nLe projet est structuré en plusieurs fichiers C, chacun ayant une responsabilité spécifique :\n\n- `builtin.c` : Implémente les commandes internes du shell.\n- `command.c` : Gère l'interprétation et l'exécution des commandes.\n- `execute.c` : Responsable de l'exécution des commandes et de la gestion des processus.\n- `job.c` : Gère les jobs et les processus en arrière-plan ou suspendus.\n- `main.c` : Point d'entrée du shell, où la boucle principale est exécutée.\n- `parser.c` : Analyse les commandes entrées par l'utilisateur.\n- `prompt.c` : Gère l'affichage et la mise à jour de l'invite de commande.\n- `redirections.c` : Gère la redirection des entrées/sorties des commandes.\n\n## Structure des Données\n\n### Job\nUn job est une structure de données qui représente une commande ou un pipeline de commandes. Elle contient les champs suivants :\n\n- `age` : Un entier représentant le numéro du job.\n- `pid` : Un identifiant de processus (de type `pid_t`) représentant l'ID du processus.\n- `state` : Une variable de type `job_state` représentant l'état du job.\n- `command` : Une chaîne de caractères représentant la ligne de commande.\n- `next` : Un pointeur vers le prochain job dans la liste (de type `struct job`).\n  \n### Command\nUne commande est une structure de données qui représente une commande simple. Elle contient les champs suivants :\n\n- `name` : Une chaîne de caractères représentant le nom de la commande.\n- `arguments` : Un pointeur vers une structure `Argument` qui contient les arguments de la commande.\n- `redirection` : Un pointeur vers une structure `Redirection` qui contient les informations de redirection de la commande.\n- `substitutions` : Un pointeur vers un tableau de pointeurs vers des structures `Command`. Ces structures représentent les substitutions de commandes (c'est-à-dire les commandes qui sont exécutées et dont le résultat est utilisé comme argument d'une autre commande).\n- `nb_substitutions` : Un entier représentant le nombre de substitutions de commandes.\n- `size_substitutions` : Un entier représentant la taille du tableau de substitutions.\n- `background` : Un entier qui indique si la commande doit être exécutée en arrière-plan (1) ou en premier plan (0).\n- `pipe` : Un pointeur vers un entier qui représente le descripteur de fichier du pipe utilisé pour la redirection de la sortie de cette commande vers l'entrée de la commande suivante.\n- `next` : Un pointeur vers la prochaine structure `Command` dans la liste des commandes pipées.\n\n### Argument\nUne structure `Argument` représente un argument d'une commande. Elle contient les champs suivants :\n\n- `value` : Une chaîne de caractères représentant la valeur de l'argument.\n- `next` : Un pointeur vers la prochaine structure `Argument` dans la liste des arguments.\n\n### Redirection\nUne structure `Redirection` représente une redirection de la sortie standard ou de l'entrée standard d'une commande. Elle contient les champs suivants :\n\n- `type` : Une variable de type `RedirectionType` représentant le type de redirection. `RedirectionType` est un énumérateur qui peut prendre des valeurs comme `REDIRECTION_INPUT`, `REDIRECTION_OUTPUT`, etc., représentant les différents types de redirections possibles.\n- `value` : Une chaîne de caractères représentant la valeur de la redirection. Cela pourrait être le nom du fichier dans lequel rediriger la sortie, par exemple.\n- `next` : Un pointeur vers la prochaine structure `Redirection` dans la liste des redirections.\n\n## Fonctionnement du Shell\n\n### Boucle Principale\nLe shell est exécuté dans une boucle infinie. À chaque itération, le shell affiche l'invite de commande, lit la commande entrée par l'utilisateur, l'analyse, l'exécute et affiche le résultat de l'exécution. La boucle principale est implémentée dans la fonction `main()` du fichier `main.c`.\n\n### Analyse de la Commande\nL'analyse de la commande est effectuée par la fonction `parse_command()` du fichier `parser.c`. Cette fonction prend une chaîne de caractères représentant la commande entrée par l'utilisateur et renvoie une structure `Command` qui représente la commande analysée. La fonction `parse_command()` utilise la fonction `parse_command_internal()` pour analyser les commandes internes et la fonction `parse_command_external()` pour analyser les commandes externes.\n\n### Exécution de la Commande\nL'exécution de la commande est effectuée par la fonction `execute_command()` du fichier `execute.c`. Cette fonction prend une structure `Command` représentant la commande à exécuter et l'exécute. La fonction `execute_command()` utilise la fonction `execute_command_internal()` pour exécuter les commandes internes et la fonction `execute_command_external()` pour exécuter les commandes externes.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamyb2%2Fjsh-sys","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsamyb2%2Fjsh-sys","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamyb2%2Fjsh-sys/lists"}