extFS-Seyshell/docs/html/exec_8c.html
2026-05-25 15:39:10 +02:00

330 lines
18 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Seyshell: src/exec.c File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">Seyshell
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
</div>
</div><!-- top -->
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle"><div class="title">exec.c File Reference</div></div>
</div><!--header-->
<div class="contents">
<p>Moteur d'exécution des commandes et gestionnaire de l'architecture des redirections (Pipes/Redirections).
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &quot;<a class="el" href="exec_8h_source.html">exec.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="disk_8h_source.html">disk.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="struct_8h_source.html">struct.h</a>&quot;</code><br />
<code>#include &lt;stdio.h&gt;</code><br />
<code>#include &lt;string.h&gt;</code><br />
<code>#include &lt;unistd.h&gt;</code><br />
</div><div class="textblock"><div class="dynheader">
Include dependency graph for exec.c:</div>
<div class="dyncontent">
<div class="center"><img src="exec_8c__incl.png" border="0" usemap="#asrc_2exec_8c" alt=""/></div>
</div>
</div><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:a4614f3f18dbc47fed5b8d5a7d85a5a7a" id="r_a4614f3f18dbc47fed5b8d5a7d85a5a7a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="exec_8c.html#a4614f3f18dbc47fed5b8d5a7d85a5a7a">do_cd</a> (<a class="el" href="structdisk.html">disk</a> *d, char *path)</td></tr>
<tr class="memdesc:a4614f3f18dbc47fed5b8d5a7d85a5a7a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Commande système <code>cd</code> (Change Directory). Modifie le répertoire de travail courant du shell. <br /></td></tr>
<tr class="separator:a4614f3f18dbc47fed5b8d5a7d85a5a7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4bc13052fbac7fb151c273fe7e692224" id="r_a4bc13052fbac7fb151c273fe7e692224"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="exec_8c.html#a4bc13052fbac7fb151c273fe7e692224">do_echo</a> (char **args)</td></tr>
<tr class="memdesc:a4bc13052fbac7fb151c273fe7e692224"><td class="mdescLeft">&#160;</td><td class="mdescRight">Commande système <code>echo</code>. Écrit les arguments sur la sortie standard avec résolution des variables d'environnement. <br /></td></tr>
<tr class="separator:a4bc13052fbac7fb151c273fe7e692224"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:afaef82623e4217aeb6b804b0e3b7f312" id="r_afaef82623e4217aeb6b804b0e3b7f312"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="exec_8c.html#afaef82623e4217aeb6b804b0e3b7f312">exec_cmd_job</a> (<a class="el" href="structdisk.html">disk</a> *d, char **args)</td></tr>
<tr class="memdesc:afaef82623e4217aeb6b804b0e3b7f312"><td class="mdescLeft">&#160;</td><td class="mdescRight">Aiguilleur interne (Dispatch) associant le libellé textuel d'une commande à sa fonction C dédiée. <br /></td></tr>
<tr class="separator:afaef82623e4217aeb6b804b0e3b7f312"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a35f8b7b9c54f10f298d00d58225920db" id="r_a35f8b7b9c54f10f298d00d58225920db"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="exec_8c.html#a35f8b7b9c54f10f298d00d58225920db">spawn_proc</a> (<a class="el" href="structdisk.html">disk</a> *d, int in, int out, <a class="el" href="structcommand.html">command</a> *cmd)</td></tr>
<tr class="memdesc:a35f8b7b9c54f10f298d00d58225920db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Crée un processus enfant isolé pour exécuter une commande isolée et configure ses redirections de flux. <br /></td></tr>
<tr class="separator:a35f8b7b9c54f10f298d00d58225920db"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a82beace5b13f7e2d89dae34187bb7f46" id="r_a82beace5b13f7e2d89dae34187bb7f46"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="exec_8c.html#a82beace5b13f7e2d89dae34187bb7f46">execute_cmd</a> (<a class="el" href="structdisk.html">disk</a> *d, <a class="el" href="structcommand.html">command</a> **args)</td></tr>
<tr class="memdesc:a82beace5b13f7e2d89dae34187bb7f46"><td class="mdescLeft">&#160;</td><td class="mdescRight">Point d'entrée principal pour l'orchestration, le pipelining et l'exécution d'une ligne de commande. <br /></td></tr>
<tr class="separator:a82beace5b13f7e2d89dae34187bb7f46"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Moteur d'exécution des commandes et gestionnaire de l'architecture des redirections (Pipes/Redirections). </p>
<p>Ce fichier prend en charge le traitement des entrées utilisateur du shell intégré. Il gère l'expansion des variables d'environnement, l'isolation des commandes via des processus séparés (fork), le routage des flux de données (inter-processus via des descripteurs de fichiers) et le support des builtins (cd). </p>
</div><h2 class="groupheader">Function Documentation</h2>
<a id="a4614f3f18dbc47fed5b8d5a7d85a5a7a" name="a4614f3f18dbc47fed5b8d5a7d85a5a7a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4614f3f18dbc47fed5b8d5a7d85a5a7a">&#9670;&#160;</a></span>do_cd()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int do_cd </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structdisk.html">disk</a> *&#160;</td>
<td class="paramname"><em>d</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">char *&#160;</td>
<td class="paramname"><em>path</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Commande système <code>cd</code> (Change Directory). Modifie le répertoire de travail courant du shell. </p>
<p>Parcourt l'arborescence logique du disque virtuel pour valider l'existence et le type du chemin demandé avant de mettre à jour la variable d'environnement "PWD".</p>
<dl class="section note"><dt>Note</dt><dd>Cette commande est une fonction intégrée (builtin) qui s'exécute impérativement dans le processus parent du shell pour impacter durablement son environnement.</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">d</td><td>Pointeur vers la structure représentant le disque virtuel. </td></tr>
<tr><td class="paramname">path</td><td>Chaîne de caractères spécifiant le chemin cible (relatif ou absolu). </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>int 1 en cas de succès, -1 si le chemin intermédiaire n'existe pas ou n'est pas un répertoire. </dd></dl>
</div>
</div>
<a id="a4bc13052fbac7fb151c273fe7e692224" name="a4bc13052fbac7fb151c273fe7e692224"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4bc13052fbac7fb151c273fe7e692224">&#9670;&#160;</a></span>do_echo()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int do_echo </td>
<td>(</td>
<td class="paramtype">char **&#160;</td>
<td class="paramname"><em>args</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Commande système <code>echo</code>. Écrit les arguments sur la sortie standard avec résolution des variables d'environnement. </p>
<p>Analyse chaque mot reçu. Si un caractère '$' suivi d'un identifiant alphanumérique ou d'un underscore est détecté, la fonction effectue une expansion dynamique en remplaçant l'identifiant par sa valeur correspondante issue du gestionnaire d'environnement (<code>get_env_value</code>).</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">args</td><td>Tableau de chaînes de caractères représentant les arguments à afficher (se terminant par NULL). </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>int 1 après affichage réussi. </dd></dl>
</div>
</div>
<a id="afaef82623e4217aeb6b804b0e3b7f312" name="afaef82623e4217aeb6b804b0e3b7f312"></a>
<h2 class="memtitle"><span class="permalink"><a href="#afaef82623e4217aeb6b804b0e3b7f312">&#9670;&#160;</a></span>exec_cmd_job()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int exec_cmd_job </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structdisk.html">disk</a> *&#160;</td>
<td class="paramname"><em>d</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">char **&#160;</td>
<td class="paramname"><em>args</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Aiguilleur interne (Dispatch) associant le libellé textuel d'une commande à sa fonction C dédiée. </p>
<p>Intercepte les commandes du SGF (ls, mkdir, touch, df, rm, rmdir, cat, echo). Pour les opérations altérant la structure du système de fichiers, une synchronisation disque immédiate (<code>persist_on_disk</code>) est déclenchée.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">d</td><td>Pointeur vers le disque virtuel. </td></tr>
<tr><td class="paramname">args</td><td>Tableau de chaînes contenant la commande à l'indice 0 et ses paramètres à la suite. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>int 1 si l'exécution s'est déroulée normalement, 0 si la commande demandée est inconnue. </dd></dl>
</div>
</div>
<a id="a82beace5b13f7e2d89dae34187bb7f46" name="a82beace5b13f7e2d89dae34187bb7f46"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a82beace5b13f7e2d89dae34187bb7f46">&#9670;&#160;</a></span>execute_cmd()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int execute_cmd </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structdisk.html">disk</a> *&#160;</td>
<td class="paramname"><em>d</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structcommand.html">command</a> **&#160;</td>
<td class="paramname"><em>args</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Point d'entrée principal pour l'orchestration, le pipelining et l'exécution d'une ligne de commande. </p>
<p>Gère de bout en bout le cycle de vie d'une instruction du Shell :</p><ol type="1">
<li>Intercepte en priorité la commande intégrée <code>cd</code>.</li>
<li>Gère la déconnexion de l'utilisateur (Ctrl+D).</li>
<li>Organise l'enchaînement séquentiel de n-commandes via des tubes anonymes (<code>pipe</code>).</li>
<li>Configure l'interception finale si une redirection de flux sortant vers un fichier (<code>&gt;</code> ou <code>&gt;&gt;</code>) est détectée.</li>
<li>Bloque le parent jusqu'à la fin de l'exécution de l'intégralité des sous-processus créés.</li>
</ol>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">d</td><td>Pointeur vers le disque virtuel. </td></tr>
<tr><td class="paramname">args</td><td>Tableau de pointeurs vers des structures <code>command</code> à exécuter en chaîne (Pipeline). Terminée par NULL. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>int Statut de sortie final obtenu via <code>waitpid()</code>. </dd></dl>
</div>
</div>
<a id="a35f8b7b9c54f10f298d00d58225920db" name="a35f8b7b9c54f10f298d00d58225920db"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a35f8b7b9c54f10f298d00d58225920db">&#9670;&#160;</a></span>spawn_proc()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int spawn_proc </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structdisk.html">disk</a> *&#160;</td>
<td class="paramname"><em>d</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>in</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>out</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structcommand.html">command</a> *&#160;</td>
<td class="paramname"><em>cmd</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Crée un processus enfant isolé pour exécuter une commande isolée et configure ses redirections de flux. </p>
<p>Cette fonction effectue un appel système <code>fork()</code>. Dans le processus enfant, elle redirige l'entrée standard et la sortie standard vers les descripteurs passés en paramètres en utilisant <code>dup2()</code>, restaure les signaux par défaut, puis invoque <code><a class="el" href="exec_8c.html#afaef82623e4217aeb6b804b0e3b7f312" title="Aiguilleur interne (Dispatch) associant le libellé textuel d&#39;une commande à sa fonction C dédiée.">exec_cmd_job()</a></code>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">d</td><td>Pointeur vers la structure du disque virtuel. </td></tr>
<tr><td class="paramname">in</td><td>Descripteur de fichier devant remplacer l'entrée standard STDIN_FILENO (0 si aucune redirection). </td></tr>
<tr><td class="paramname">out</td><td>Descripteur de fichier devant remplacer la sortie standard STDOUT_FILENO (1 si aucune redirection). </td></tr>
<tr><td class="paramname">cmd</td><td>Pointeur vers la structure de commande modélisant l'appel utilisateur. </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>int Le PID du processus fils généré pour le processus parent, ou 0 pour l'enfant. </dd></dl>
</div>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8
</small></address>
</body>
</html>