<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>C : coups de cœur et coups de gueule &#187; Manipulation des processus</title>
	<atom:link href="https://blog.developpez.com/kirilenko/pcategory/manipulation-des-processus/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/kirilenko</link>
	<description>Write in C!</description>
	<lastBuildDate>Sat, 20 Apr 2013 16:54:09 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Le bloc de contrôle de processus</title>
		<link>https://blog.developpez.com/kirilenko/p10651/manipulation-des-processus/le_bloc_de_controle_de_processus</link>
		<comments>https://blog.developpez.com/kirilenko/p10651/manipulation-des-processus/le_bloc_de_controle_de_processus#comments</comments>
		<pubDate>Sat, 14 Jan 2012 17:37:26 +0000</pubDate>
		<dc:creator><![CDATA[Kirilenko]]></dc:creator>
				<category><![CDATA[Manipulation des processus]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le système d&#8217;exploitation dispose d&#8217;une table de processus, permettant de gérer de manière globale chaque processus. Chaque processus possède une entrée, appelée bloc de contrôle de processus. Il contient diverses informations, comme : &#8211; son PID ; &#8211; son PPID ; &#8211; son état ; &#8211; son contexte processeur (état des registres) et mémoire (adresses de l&#8217;espace d&#8217;adressage) ; &#8211; ses critères d&#8217;ordonnancement ; &#8211; les fichiers ouverts.]]></description>
				<content:encoded><![CDATA[<p>Le système d&rsquo;exploitation dispose d&rsquo;une <strong>table de processus</strong>, permettant de gérer de manière globale chaque processus.<br />
Chaque processus possède une entrée, appelée <strong>bloc de contrôle</strong> de processus. Il contient diverses informations, comme :</p>
<p>&#8211; son PID ;<br />
&#8211; son PPID ;<br />
&#8211; son état ;<br />
&#8211; son contexte processeur (état des registres) et mémoire (adresses de l&rsquo;espace d&rsquo;adressage) ;<br />
&#8211; ses critères d&rsquo;ordonnancement ;<br />
&#8211; les fichiers ouverts.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Etats d&#8217;un processus</title>
		<link>https://blog.developpez.com/kirilenko/p10650/manipulation-des-processus/etats_d_un_processus</link>
		<comments>https://blog.developpez.com/kirilenko/p10650/manipulation-des-processus/etats_d_un_processus#comments</comments>
		<pubDate>Sat, 14 Jan 2012 17:34:49 +0000</pubDate>
		<dc:creator><![CDATA[Kirilenko]]></dc:creator>
				<category><![CDATA[Manipulation des processus]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Un processus Unix peut-être caractérisé par son état. Il existe communément trois états : &#8211; élu ; &#8211; bloqué ; &#8211; prêt. Un processus est dans l&#8217;état élu lorsqu&#8217;il s&#8217;exécute, après avoir obtenu le processeur. Il est bloqué lorsqu&#8217;il est en attente, par exemple d&#8217;une lecture de disque. Il est dans l&#8217;état prêt lorsqu&#8217;il est n&#8217;est pas en attente, mais qu&#8217;il n&#8217;a pas le processeur. Il attend simplement que ce soit son tour. Le passage [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Un processus Unix peut-être caractérisé par son <strong>état</strong>. Il existe communément trois états :</p>
<p>&#8211; <strong>élu</strong> ;<br />
&#8211; <strong>bloqué</strong> ;<br />
&#8211; <strong>prêt</strong>.</p>
<p>Un processus est dans l&rsquo;état élu lorsqu&rsquo;il s&rsquo;exécute, après avoir obtenu le processeur.<br />
Il est bloqué lorsqu&rsquo;il est en attente, par exemple d&rsquo;une lecture de disque.<br />
Il est dans l&rsquo;état prêt lorsqu&rsquo;il est n&rsquo;est pas en attente, mais qu&rsquo;il n&rsquo;a pas le processeur. Il attend simplement que ce soit son tour.</p>
<p>Le passage de l&rsquo;état prêt à l&rsquo;état élu constitue l&rsquo;opération d&rsquo;<strong>élection</strong>.<br />
Le passage de l&rsquo;état élu à l&rsquo;état bloqué constitue l&rsquo;opération de <strong>blocage</strong>.<br />
Le passage de l&rsquo;état bloqué à l&rsquo;état prêt constitue l&rsquo;opération de <strong>déblocage</strong>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Terminaison de processus</title>
		<link>https://blog.developpez.com/kirilenko/p10641/manipulation-des-processus/terminaison_de_processus</link>
		<comments>https://blog.developpez.com/kirilenko/p10641/manipulation-des-processus/terminaison_de_processus#comments</comments>
		<pubDate>Tue, 10 Jan 2012 18:21:15 +0000</pubDate>
		<dc:creator><![CDATA[Kirilenko]]></dc:creator>
				<category><![CDATA[Manipulation des processus]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Un processus peut se terminer suite à l&#8217;appel de la fonction : void exit(int status); de stdlib.h. status est un entier, qui permet d&#8217;indiquer la valeur de retour du processus. Conventionnellement, on utilise la valeur de 0 pour indiquer une sortie correcte, ou une autre valeur pour indiquer l&#8217;erreur. Exemple : #include &#60;stdio.h&#62; #include &#60;stdlib.h&#62; #include &#60;unistd.h&#62; #include &#60;sys/types.h&#62; &#160; void task(void) { &#160; puts(&#34;Child process... end.&#34;); &#160; exit(0); } &#160; int main(void) { &#160; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Un processus peut se terminer suite à l&rsquo;appel de la fonction :</p>
<p><code class="codecolorer text default"><span class="text">void exit(int status);</span></code></p>
<p>de stdlib.h.</p>
<p>status est un entier, qui permet d&rsquo;indiquer la valeur de retour du processus. Conventionnellement, on utilise la valeur de 0 pour indiquer une sortie correcte, ou une autre valeur pour indiquer l&rsquo;erreur. Exemple :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#include &lt;stdio.h&gt; <br />
#include &lt;stdlib.h&gt; <br />
#include &lt;unistd.h&gt; <br />
#include &lt;sys/types.h&gt; <br />
&nbsp;<br />
void task(void) { <br />
&nbsp; puts(&quot;Child process... end.&quot;); <br />
&nbsp; exit(0); <br />
} <br />
&nbsp;<br />
int main(void) { <br />
&nbsp; pid_t p; <br />
&nbsp;<br />
&nbsp; p = fork(); <br />
&nbsp;<br />
&nbsp; switch (p) { <br />
&nbsp; &nbsp; case -1: <br />
&nbsp; &nbsp; &nbsp; perror(&quot;fork&quot;); <br />
&nbsp; &nbsp; &nbsp; break; <br />
&nbsp; &nbsp; case 0: <br />
&nbsp; &nbsp; &nbsp; task(); <br />
&nbsp; &nbsp; &nbsp; break; <br />
&nbsp; &nbsp; default: <br />
&nbsp; &nbsp; &nbsp; puts(&quot;Father process...&quot;); <br />
&nbsp; &nbsp; &nbsp; break; <br />
&nbsp; } <br />
&nbsp; return EXIT_SUCCESS; <br />
}</div></div>
<p>On pourra récupérer la valeur envoyée à exit par un processus fils par son processus père, et ce sera l&rsquo;objet d&rsquo;un prochain article plus complet, concernant la synchronisation des processus.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quelques fonctions bien utiles</title>
		<link>https://blog.developpez.com/kirilenko/p10637/manipulation-des-processus/quelques_fonctions_bien_utiles</link>
		<comments>https://blog.developpez.com/kirilenko/p10637/manipulation-des-processus/quelques_fonctions_bien_utiles#comments</comments>
		<pubDate>Mon, 09 Jan 2012 18:41:20 +0000</pubDate>
		<dc:creator><![CDATA[Kirilenko]]></dc:creator>
				<category><![CDATA[Manipulation des processus]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Après avoir introduit la création des processus, je souhaitais vous présenter quelques fonctions qui sont utiles, notamment lors du débogage de votre application. Je cite : pid_t getpid(void); qui retourne le PID du processus courant. pid_t getppid(void); qui retourne le PID du processus père du processus courant. uid_t getuid(void); qui retourne l&#8217;UID (identificateur de l&#8217;utilisateur qui a créé le processus) du processus courant. gid_t getgid(void); qui retourne le GID (identificateur du groupe auquel appartient [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Après avoir introduit la création des processus, je souhaitais vous présenter quelques fonctions qui sont utiles, notamment lors du débogage de votre application.</p>
<p>Je cite :</p>
<p><code class="codecolorer text default"><span class="text">pid_t getpid(void);</span></code></p>
<p>qui retourne le PID du processus courant.</p>
<p><code class="codecolorer text default"><span class="text">pid_t getppid(void);</span></code></p>
<p>qui retourne le PID du processus père du processus courant.</p>
<p><code class="codecolorer text default"><span class="text">uid_t getuid(void);</span></code></p>
<p>qui retourne l&rsquo;UID (identificateur de l&rsquo;utilisateur qui a créé le processus) du processus courant.</p>
<p><code class="codecolorer text default"><span class="text">gid_t getgid(void);</span></code></p>
<p>qui retourne le GID (identificateur du groupe auquel appartient l&rsquo;utilisateur) du processus courant.</p>
<p>Exemple qui résument les fonctions que je viens de vous présenter :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#include &lt;stdio.h&gt; <br />
#include &lt;stdlib.h&gt; <br />
#include &lt;unistd.h&gt; <br />
#include &lt;sys/types.h&gt; <br />
&nbsp;<br />
int main(void) { <br />
&nbsp; pid_t p; <br />
&nbsp;<br />
&nbsp; p = fork(); <br />
&nbsp;<br />
&nbsp; switch (p) { <br />
&nbsp; case -1: <br />
&nbsp; &nbsp; perror(&quot;fork&quot;); <br />
&nbsp; &nbsp; break; <br />
&nbsp; case 0: <br />
&nbsp; &nbsp; fprintf(stdout, &quot;I'm father process.\n&quot;); <br />
&nbsp; &nbsp; break; <br />
&nbsp; default: <br />
&nbsp; &nbsp; fprintf(stdout, &quot;I'm child process, PID = #%u&quot; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &quot; ; PPID = #%u ; UID = #%u ; GID = #%u\n&quot;, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(unsigned)getpid(), (unsigned)getppid(), &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(unsigned)getuid(), (unsigned)getgid()); <br />
&nbsp; } <br />
&nbsp; return EXIT_SUCCESS; <br />
}</div></div>
<p>Bon codage !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Création de processus</title>
		<link>https://blog.developpez.com/kirilenko/p10636/manipulation-des-processus/creation_de_processus</link>
		<comments>https://blog.developpez.com/kirilenko/p10636/manipulation-des-processus/creation_de_processus#comments</comments>
		<pubDate>Mon, 09 Jan 2012 18:16:58 +0000</pubDate>
		<dc:creator><![CDATA[Kirilenko]]></dc:creator>
				<category><![CDATA[Manipulation des processus]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Dans ce billet, qui est le premier de ce blog, je souhaitais vous présenter mon projet. Je suis passionné par la programmation en C, et plus particulièrement par l&#8217;aspect « bas niveau » de celle-ci. Le C a été créé pour développer le système d&#8217;exploitation UNIX, sur lequel sont basés la plupart des OS couramment usés. La programmation système consiste au développement d&#8217;applications qui font partie intégrante du système d&#8217;exploitation. C&#8217;est ce type de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Dans ce billet, qui est le premier de ce blog, je souhaitais vous présenter mon projet. Je suis passionné par la programmation en C, et plus particulièrement par l&rsquo;aspect « bas niveau » de celle-ci. Le C a été créé pour développer le système d&rsquo;exploitation UNIX, sur lequel sont basés la plupart des OS couramment usés.<br />
La programmation système consiste au développement d&rsquo;applications qui font partie intégrante du système d&rsquo;exploitation. C&rsquo;est ce type de programmation, opposée aux programmes utilisateurs, que je voulais vous faire découvrir dans ce blog.</p>
<p>Ce premier billet commence par la pratique, et avec la création des processus. Les processus représentent l&rsquo;image d&rsquo;un programme à un instant donné (état des registres entres autres).</p>
<p>Chaque processus possède un espace d&rsquo;adressage donné, dans lequel il peut lire et écrire. Cet espace est divisé en trois grandes parties (segment texte, segment données, pile).</p>
<p>En C et sous un système d&rsquo;exploitation basé sur UNIX, il est possible de créer un processus grâce à la fonction conforme POSIX.1 :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#include &lt;unistd.h&gt; <br />
&nbsp;<br />
pid_t fork(void);</div></div>
<p>Le type pid_t (déclaré dans sys/types.h) représente l&rsquo;identificateur d&rsquo;un processus (appelé PID pour Process IDentifier). En l&rsquo;occurrence, la fonction renvoie trois valeurs, suivant ce qui s&rsquo;est passé lors de l&rsquo;exécution de cet appel-système :</p>
<ul>
<li>-1 en cas d&rsquo;erreur, et errno est positionnée pour contenir le code de l&rsquo;erreur (à savoir EAGAIN ou ENOMEM) ;</li>
<li>0 si on est dans le processus père ;</li>
<li>une autre valeur, positive, indiquant le PID du processus créé (appelé processus fils).</li>
</ul>
<p>Premier exemple pratique :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#include &lt;stdio.h&gt; <br />
#include &lt;stdlib.h&gt; <br />
#include &lt;unistd.h&gt; <br />
#include &lt;sys/types.h&gt; <br />
&nbsp;<br />
int main(void) { <br />
&nbsp; pid_t p; <br />
&nbsp;<br />
&nbsp; p = fork(); <br />
&nbsp;<br />
&nbsp; switch (p) { <br />
&nbsp; case -1: <br />
&nbsp; &nbsp; perror(&quot;fork&quot;); <br />
&nbsp; &nbsp; break; <br />
&nbsp; case 0: <br />
&nbsp; &nbsp; fprintf(stdout, &quot;I'm father process.\n&quot;); <br />
&nbsp; &nbsp; break; <br />
&nbsp; default: <br />
&nbsp; &nbsp; fprintf(stdout, &quot;I'm child process, PID = #%u&quot;, (unsigned)p); <br />
&nbsp; &nbsp; break; <br />
&nbsp; } <br />
&nbsp; return EXIT_SUCCESS; <br />
}</div></div>
<p>Le résultat peut varier selon l&rsquo;ordre d&rsquo;exécution des processus sur votre machine. Notez que la synchronisation des processus pourrait permettre une certaine unité, et ce sera l&rsquo;objectif d&rsquo;un des prochains articles !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
