1929 lines
285 KiB
HTML
1929 lines
285 KiB
HTML
|
<!DOCTYPE html>
|
|||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" data-darkreader-mode="dynamic" data-darkreader-scheme="dark" lang="fr"><head><style class="darkreader darkreader--fallback" media="screen"></style><style class="darkreader darkreader--text" media="screen"></style><style class="darkreader darkreader--invert" media="screen">.jfk-bubble.gtx-bubble, .captcheck_answer_label > input + img, span#closed_text > img[src^="https://www.gstatic.com/images/branding/googlelogo"], span[data-href^="https://www.hcaptcha.com/"] > #icon, #bit-notification-bar-iframe, embed[type="application/pdf"] {
|
|||
|
filter: invert(100%) hue-rotate(180deg) contrast(90%) !important;
|
|||
|
}</style><style class="darkreader darkreader--inline" media="screen">[data-darkreader-inline-bgcolor] {
|
|||
|
background-color: var(--darkreader-inline-bgcolor) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-bgimage] {
|
|||
|
background-image: var(--darkreader-inline-bgimage) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-border] {
|
|||
|
border-color: var(--darkreader-inline-border) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-border-bottom] {
|
|||
|
border-bottom-color: var(--darkreader-inline-border-bottom) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-border-left] {
|
|||
|
border-left-color: var(--darkreader-inline-border-left) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-border-right] {
|
|||
|
border-right-color: var(--darkreader-inline-border-right) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-border-top] {
|
|||
|
border-top-color: var(--darkreader-inline-border-top) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-boxshadow] {
|
|||
|
box-shadow: var(--darkreader-inline-boxshadow) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-color] {
|
|||
|
color: var(--darkreader-inline-color) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-fill] {
|
|||
|
fill: var(--darkreader-inline-fill) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-stroke] {
|
|||
|
stroke: var(--darkreader-inline-stroke) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-outline] {
|
|||
|
outline-color: var(--darkreader-inline-outline) !important;
|
|||
|
}
|
|||
|
[data-darkreader-inline-stopcolor] {
|
|||
|
stop-color: var(--darkreader-inline-stopcolor) !important;
|
|||
|
}</style><style class="darkreader darkreader--variables" media="screen">:root {
|
|||
|
--darkreader-neutral-background: #131516;
|
|||
|
--darkreader-neutral-text: #d8d4cf;
|
|||
|
--darkreader-selection-background: #004daa;
|
|||
|
--darkreader-selection-text: #e8e6e3;
|
|||
|
}</style><style class="darkreader darkreader--root-vars" media="screen"></style><script class="darkreader darkreader--proxy">(function injectProxy() {
|
|||
|
document.dispatchEvent(new CustomEvent('__darkreader__inlineScriptsAllowed'));
|
|||
|
const addRuleDescriptor = Object.getOwnPropertyDescriptor(CSSStyleSheet.prototype, 'addRule');
|
|||
|
const insertRuleDescriptor = Object.getOwnPropertyDescriptor(CSSStyleSheet.prototype, 'insertRule');
|
|||
|
const deleteRuleDescriptor = Object.getOwnPropertyDescriptor(CSSStyleSheet.prototype, 'deleteRule');
|
|||
|
const removeRuleDescriptor = Object.getOwnPropertyDescriptor(CSSStyleSheet.prototype, 'removeRule');
|
|||
|
const shouldWrapDocStyleSheets = location.hostname.endsWith('pushbullet.com');
|
|||
|
const documentStyleSheetsDescriptor = shouldWrapDocStyleSheets ? Object.getOwnPropertyDescriptor(Document.prototype, 'styleSheets') : null;
|
|||
|
const cleanUp = () => {
|
|||
|
Object.defineProperty(CSSStyleSheet.prototype, 'addRule', addRuleDescriptor);
|
|||
|
Object.defineProperty(CSSStyleSheet.prototype, 'insertRule', insertRuleDescriptor);
|
|||
|
Object.defineProperty(CSSStyleSheet.prototype, 'deleteRule', deleteRuleDescriptor);
|
|||
|
Object.defineProperty(CSSStyleSheet.prototype, 'removeRule', removeRuleDescriptor);
|
|||
|
document.removeEventListener('__darkreader__cleanUp', cleanUp);
|
|||
|
document.removeEventListener('__darkreader__addUndefinedResolver', addUndefinedResolver);
|
|||
|
if (shouldWrapDocStyleSheets) {
|
|||
|
Object.defineProperty(Document.prototype, 'styleSheets', documentStyleSheetsDescriptor);
|
|||
|
}
|
|||
|
};
|
|||
|
const addUndefinedResolver = (e) => {
|
|||
|
customElements.whenDefined(e.detail.tag).then(() => {
|
|||
|
document.dispatchEvent(new CustomEvent('__darkreader__isDefined', { detail: { tag: e.detail.tag } }));
|
|||
|
});
|
|||
|
};
|
|||
|
document.addEventListener('__darkreader__cleanUp', cleanUp);
|
|||
|
document.addEventListener('__darkreader__addUndefinedResolver', addUndefinedResolver);
|
|||
|
const updateSheetEvent = new Event('__darkreader__updateSheet');
|
|||
|
function proxyAddRule(selector, style, index) {
|
|||
|
addRuleDescriptor.value.call(this, selector, style, index);
|
|||
|
if (this.ownerNode && !this.ownerNode.classList.contains('darkreader')) {
|
|||
|
this.ownerNode.dispatchEvent(updateSheetEvent);
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
function proxyInsertRule(rule, index) {
|
|||
|
const returnValue = insertRuleDescriptor.value.call(this, rule, index);
|
|||
|
if (this.ownerNode && !this.ownerNode.classList.contains('darkreader')) {
|
|||
|
this.ownerNode.dispatchEvent(updateSheetEvent);
|
|||
|
}
|
|||
|
return returnValue;
|
|||
|
}
|
|||
|
function proxyDeleteRule(index) {
|
|||
|
deleteRuleDescriptor.value.call(this, index);
|
|||
|
if (this.ownerNode && !this.ownerNode.classList.contains('darkreader')) {
|
|||
|
this.ownerNode.dispatchEvent(updateSheetEvent);
|
|||
|
}
|
|||
|
}
|
|||
|
function proxyRemoveRule(index) {
|
|||
|
removeRuleDescriptor.value.call(this, index);
|
|||
|
if (this.ownerNode && !this.ownerNode.classList.contains('darkreader')) {
|
|||
|
this.ownerNode.dispatchEvent(updateSheetEvent);
|
|||
|
}
|
|||
|
}
|
|||
|
function proxyDocumentStyleSheets() {
|
|||
|
const docSheets = documentStyleSheetsDescriptor.get.call(this);
|
|||
|
const filtered = [...docSheets].filter((styleSheet) => {
|
|||
|
return !styleSheet.ownerNode.classList.contains('darkreader');
|
|||
|
});
|
|||
|
return Object.setPrototypeOf(filtered, StyleSheetList.prototype);
|
|||
|
}
|
|||
|
Object.defineProperty(CSSStyleSheet.prototype, 'addRule', Object.assign({}, addRuleDescriptor, { value: proxyAddRule }));
|
|||
|
Object.defineProperty(CSSStyleSheet.prototype, 'insertRule', Object.assign({}, insertRuleDescriptor, { value: proxyInsertRule }));
|
|||
|
Object.defineProperty(CSSStyleSheet.prototype, 'deleteRule', Object.assign({}, deleteRuleDescriptor, { value: proxyDeleteRule }));
|
|||
|
Object.defineProperty(CSSStyleSheet.prototype, 'removeRule', Object.assign({}, removeRuleDescriptor, { value: proxyRemoveRule }));
|
|||
|
if (shouldWrapDocStyleSheets) {
|
|||
|
Object.defineProperty(Document.prototype, 'styleSheets', Object.assign({}, documentStyleSheetsDescriptor, { get: proxyDocumentStyleSheets }));
|
|||
|
}
|
|||
|
})()</script><style class="darkreader darkreader--user-agent" media="screen">html {
|
|||
|
background-color: #181a1b !important;
|
|||
|
}
|
|||
|
html, body, input, textarea, select, button {
|
|||
|
background-color: #181a1b;
|
|||
|
}
|
|||
|
html, body, input, textarea, select, button {
|
|||
|
border-color: #736b5e;
|
|||
|
color: #e8e6e3;
|
|||
|
}
|
|||
|
a {
|
|||
|
color: #3391ff;
|
|||
|
}
|
|||
|
table {
|
|||
|
border-color: #545b5e;
|
|||
|
}
|
|||
|
::placeholder {
|
|||
|
color: #b2aba1;
|
|||
|
}
|
|||
|
input:-webkit-autofill,
|
|||
|
textarea:-webkit-autofill,
|
|||
|
select:-webkit-autofill {
|
|||
|
background-color: #555b00 !important;
|
|||
|
color: #e8e6e3 !important;
|
|||
|
}
|
|||
|
::-webkit-scrollbar {
|
|||
|
background-color: #202324;
|
|||
|
color: #aba499;
|
|||
|
}
|
|||
|
::-webkit-scrollbar-thumb {
|
|||
|
background-color: #454a4d;
|
|||
|
}
|
|||
|
::-webkit-scrollbar-thumb:hover {
|
|||
|
background-color: #575e62;
|
|||
|
}
|
|||
|
::-webkit-scrollbar-thumb:active {
|
|||
|
background-color: #484e51;
|
|||
|
}
|
|||
|
::-webkit-scrollbar-corner {
|
|||
|
background-color: #181a1b;
|
|||
|
}
|
|||
|
* {
|
|||
|
scrollbar-color: #454a4d #202324;
|
|||
|
}
|
|||
|
::selection {
|
|||
|
background-color: #004daa !important;
|
|||
|
color: #e8e6e3 !important;
|
|||
|
}
|
|||
|
::-moz-selection {
|
|||
|
background-color: #004daa !important;
|
|||
|
color: #e8e6e3 !important;
|
|||
|
}</style>
|
|||
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
|||
|
<meta charset="utf-8">
|
|||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|||
|
<title>Processus Unix</title>
|
|||
|
<meta name="generator" content="Org-mode">
|
|||
|
<meta name="author" content="Zouheir HAMROUNI">
|
|||
|
<style type="text/css">
|
|||
|
<!--/*-->
|
|||
|
<![CDATA[/*><!--*/
|
|||
|
.title { text-align: center;
|
|||
|
margin-bottom: .2em; color: #4020A0;}
|
|||
|
.subtitle { text-align: center;
|
|||
|
font-size: medium;
|
|||
|
font-weight: bold;
|
|||
|
margin-top:0; }
|
|||
|
.todo { font-family: monospace; color: red; }
|
|||
|
.done { font-family: monospace; color: green; }
|
|||
|
.priority { font-family: monospace; color: orange; }
|
|||
|
.tag { background-color: #eee; font-family: monospace;
|
|||
|
padding: 2px; font-size: 80%; font-weight: normal; }
|
|||
|
.timestamp { color: #bebebe; }
|
|||
|
.timestamp-kwd { color: #5f9ea0; }
|
|||
|
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
|
|||
|
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
|
|||
|
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
|
|||
|
.underline { text-decoration: underline; }
|
|||
|
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
|
|||
|
p.verse { margin-left: 3%; }
|
|||
|
pre {
|
|||
|
border: 1px solid #ccc;
|
|||
|
box-shadow: 3px 3px 3px #eee;
|
|||
|
padding: 4pt;
|
|||
|
font-family: monospace;
|
|||
|
font-size: 90%;
|
|||
|
overflow: auto;
|
|||
|
margin: 0em;
|
|||
|
top-margin: 2em;
|
|||
|
}
|
|||
|
pre.src {
|
|||
|
position: relative;
|
|||
|
overflow: visible;
|
|||
|
padding-top: 1.2em;
|
|||
|
}
|
|||
|
pre.src:before {
|
|||
|
display: none;
|
|||
|
position: absolute;
|
|||
|
background-color: white;
|
|||
|
top: -10px;
|
|||
|
right: 10px;
|
|||
|
padding: 2px;
|
|||
|
border: 1px solid black;
|
|||
|
}
|
|||
|
pre.src:hover:before { display: inline;}
|
|||
|
pre.src-sh:before { content: 'sh'; }
|
|||
|
pre.src-bash:before { content: 'sh'; }
|
|||
|
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
|
|||
|
pre.src-R:before { content: 'R'; }
|
|||
|
pre.src-perl:before { content: 'Perl'; }
|
|||
|
pre.src-java:before { content: 'Java'; }
|
|||
|
pre.src-sql:before { content: 'SQL'; }
|
|||
|
|
|||
|
table { border-collapse:collapse; }
|
|||
|
caption.t-above { caption-side: top; }
|
|||
|
caption.t-bottom { caption-side: bottom; }
|
|||
|
td, th { vertical-align:top; }
|
|||
|
th.org-right { text-align: center; }
|
|||
|
th.org-left { text-align: center; }
|
|||
|
th.org-center { text-align: center; }
|
|||
|
td.org-right { text-align: right; }
|
|||
|
td.org-left { text-align: left; }
|
|||
|
td.org-center { text-align: center; }
|
|||
|
dt { font-weight: bold; }
|
|||
|
.footpara { display: inline; }
|
|||
|
.footdef { margin-bottom: 1em; }
|
|||
|
.figure { padding: 1em; }
|
|||
|
.figure p { text-align: center; }
|
|||
|
.inlinetask {
|
|||
|
padding: 10px;
|
|||
|
border: 2px solid gray;
|
|||
|
margin: 10px;
|
|||
|
background: #ffffcc;
|
|||
|
}
|
|||
|
#org-div-home-and-up
|
|||
|
{ text-align: right; font-size: 70%; white-space: nowrap; }
|
|||
|
textarea { overflow-x: auto; }
|
|||
|
.linenr { font-size: smaller }
|
|||
|
.code-highlighted { background-color: #ffff00; }
|
|||
|
.org-info-js_info-navigation { border-style: none; }
|
|||
|
#org-info-js_console-label
|
|||
|
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
|
|||
|
.org-info-js_search-highlight
|
|||
|
{ background-color: #ffff00; color: #000000; font-weight: bold; }
|
|||
|
/*]]>
|
|||
|
</style><style class="darkreader darkreader--sync" media="screen"></style>
|
|||
|
<style>
|
|||
|
@media only screen and (min-width: 1024px) {
|
|||
|
#table-of-contents {
|
|||
|
position: fixed;
|
|||
|
top: 0;
|
|||
|
left: 0;
|
|||
|
bottom: 0;
|
|||
|
width: 36ex;
|
|||
|
overflow-y: auto;
|
|||
|
border-right: 1px solid #e8e8e8;
|
|||
|
padding: 0 15px;
|
|||
|
font-size: 14px;
|
|||
|
background-color: #f0f0f0;
|
|||
|
-webkit-overflow-scrolling: touch;
|
|||
|
}
|
|||
|
body {
|
|||
|
position: absolute;
|
|||
|
top: 0;
|
|||
|
left: 20%;
|
|||
|
width: 84ex;
|
|||
|
margin-left: auto;
|
|||
|
margin-right: auto;
|
|||
|
text-align: justify;
|
|||
|
hyphens: auto;
|
|||
|
-moz-hyphens: auto;
|
|||
|
-webkit-hyphens: auto;
|
|||
|
-ms-hyphens: auto;
|
|||
|
right: 0;
|
|||
|
padding: 0 15px;
|
|||
|
-webkit-overflow-scrolling: touch;
|
|||
|
font-size: 14px;
|
|||
|
}
|
|||
|
}
|
|||
|
@media only print {
|
|||
|
#table-of-contents, #nav {
|
|||
|
display: none;
|
|||
|
}
|
|||
|
}
|
|||
|
@media only screen and (max-width: 1023px) {
|
|||
|
#table-of-contents {
|
|||
|
width: 100%;
|
|||
|
top: 40px;
|
|||
|
}
|
|||
|
body {
|
|||
|
text-align: justify;
|
|||
|
hyphens: auto;
|
|||
|
-moz-hyphens: auto;
|
|||
|
-webkit-hyphens: auto;
|
|||
|
-ms-hyphens: auto;
|
|||
|
width: 84ex;
|
|||
|
margin-left: auto;
|
|||
|
margin-right: auto;
|
|||
|
right: 0;
|
|||
|
padding: 0 15px;
|
|||
|
-webkit-overflow-scrolling: touch;
|
|||
|
font-size: 14px;
|
|||
|
}
|
|||
|
}
|
|||
|
@media (min-width: 768px) {
|
|||
|
body {
|
|||
|
max-width: 750px;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
body {
|
|||
|
font-family:Roboto,'Helvetica Neue',sans-serif;
|
|||
|
}
|
|||
|
|
|||
|
.org-info-js_header-navigation > a,
|
|||
|
.org-info-js_info-navigation a[accesskey],
|
|||
|
.org-info-js_info-navigation > tbody:nth-child(1) > tr:nth-child(1) > td:nth-child(1) > span:nth-child(2) > a:nth-child(1)
|
|||
|
{
|
|||
|
font-size: 1ex;
|
|||
|
border-radius: 10px;
|
|||
|
padding: 5px;
|
|||
|
margin-top: 5px;
|
|||
|
margin-bottom: 5px;
|
|||
|
background-color: #F9F9F9;
|
|||
|
border: solid 1px #EFE9E9;
|
|||
|
color: #804040;
|
|||
|
text-decoration: none;
|
|||
|
}
|
|||
|
|
|||
|
#table-of-contents ul {
|
|||
|
padding: 0;
|
|||
|
}
|
|||
|
.toc-h1 {
|
|||
|
margin-left: 0ex;
|
|||
|
list-style-type: none;
|
|||
|
}
|
|||
|
.toc-h2 {
|
|||
|
margin-left: 3ex;
|
|||
|
list-style-type: none;
|
|||
|
}
|
|||
|
.toc-h3 {
|
|||
|
margin-left: 6ex;
|
|||
|
list-style-type: none;
|
|||
|
}
|
|||
|
|
|||
|
a {
|
|||
|
color: #202090;
|
|||
|
}
|
|||
|
#table-of-contents a,
|
|||
|
.org-info-js_info-navigation a {
|
|||
|
text-decoration: none;
|
|||
|
}
|
|||
|
#table-of-contents a:hover {
|
|||
|
text-decoration: underline;
|
|||
|
text-color: #502030;
|
|||
|
}
|
|||
|
#table-of-contents a:visited {
|
|||
|
color: #d02010;
|
|||
|
}
|
|||
|
#table-of-contents a {
|
|||
|
color: #101080;
|
|||
|
}
|
|||
|
#table-of-contents {
|
|||
|
background-color: #FaFaFf;
|
|||
|
}
|
|||
|
#table-of-contents a.current, #table-of-contents .toc-active {
|
|||
|
background-color: #f0e0d0;
|
|||
|
}
|
|||
|
pre.src, pre.example {
|
|||
|
font-size: 90%;
|
|||
|
overflow-y : scroll;
|
|||
|
}
|
|||
|
@media (max-width: 400px) {
|
|||
|
pre.src, pre.example {
|
|||
|
overflow-x: scroll;
|
|||
|
}
|
|||
|
}
|
|||
|
code {
|
|||
|
background: #F0A040;
|
|||
|
border: solid 1px #E0E8E0;
|
|||
|
padding-top: 0ex;
|
|||
|
padding-bottom: 0ex;
|
|||
|
padding-left: .1ex;
|
|||
|
padding-right: .1ex;
|
|||
|
font-size: 110%;
|
|||
|
border-radius: 5px;
|
|||
|
}
|
|||
|
methode {
|
|||
|
background: #F0F0F0;
|
|||
|
border: solid 1px #E0E8E0;
|
|||
|
padding-top: 0ex;
|
|||
|
padding-bottom: 0ex;
|
|||
|
padding-left: .1ex;
|
|||
|
padding-right: .1ex;
|
|||
|
font-size: 100%;
|
|||
|
border-radius: 5px;
|
|||
|
}
|
|||
|
touche {
|
|||
|
background: #A0A0A0;
|
|||
|
border: solid 1px #101010;
|
|||
|
padding-top: 0ex;
|
|||
|
padding-bottom: 0ex;
|
|||
|
padding-left: .4ex;
|
|||
|
padding-right: .4ex;
|
|||
|
font-size: 100%;
|
|||
|
border-radius: 2px;
|
|||
|
}
|
|||
|
|
|||
|
.encadreblanc {
|
|||
|
border: solid;
|
|||
|
border-radius: 0.5em;
|
|||
|
margin: 0.1em;
|
|||
|
border-width: 0.1em;
|
|||
|
padding: 0.5em;
|
|||
|
}
|
|||
|
.jeudepiste {
|
|||
|
border: solid;
|
|||
|
border-radius: 0.5em;
|
|||
|
border-color: #4060F0;
|
|||
|
margin: 0.1em;
|
|||
|
border-width: 0.1em;
|
|||
|
padding: 0.5em;
|
|||
|
background-color: #E0F0FF;
|
|||
|
}
|
|||
|
.conseil {
|
|||
|
border: solid;
|
|||
|
border-radius: 0.5em;
|
|||
|
border-color: #80E060;
|
|||
|
margin: 0.1em;
|
|||
|
border-width: 0.1em;
|
|||
|
padding: 0.5em;
|
|||
|
background-color: #B0F0A0;
|
|||
|
}
|
|||
|
.clavier {
|
|||
|
border: solid;
|
|||
|
border-width: 0.1em;
|
|||
|
border-radius: 0.5em;
|
|||
|
padding: 0.2em;
|
|||
|
display: inline-block;
|
|||
|
}
|
|||
|
.attention {
|
|||
|
border-radius: 0.5em;
|
|||
|
border:solid;
|
|||
|
border-color: #F04010;
|
|||
|
border-width: 0.1em;
|
|||
|
padding: 0.5em;
|
|||
|
margin: 0.1em;
|
|||
|
background-color: #FFD080;
|
|||
|
}
|
|||
|
.interdit {
|
|||
|
border-radius: 0.5em;
|
|||
|
border:solid;
|
|||
|
border-color: #F02010;
|
|||
|
border-width: 0.1em;
|
|||
|
padding: 0.5em;
|
|||
|
margin: 0.1em;
|
|||
|
background-color: #FFB090;
|
|||
|
}
|
|||
|
</style><style class="darkreader darkreader--sync" media="screen"></style>
|
|||
|
|
|||
|
<script type="text/javascript" src="processus_files/jquery.js"></script><meta name="darkreader" content="28a48d3bad4f3d1d6c9476d26e47a960"><style class="darkreader darkreader--override" media="screen">.vimvixen-hint {
|
|||
|
background-color: #7b5300 !important;
|
|||
|
border-color: #d8b013 !important;
|
|||
|
color: #f3e8c8 !important;
|
|||
|
}
|
|||
|
::placeholder {
|
|||
|
opacity: 0.5 !important;
|
|||
|
}
|
|||
|
a[href="https://coinmarketcap.com/"] > svg[width="94"][height="16"] > path {
|
|||
|
fill: var(--darkreader-neutral-text) !important;
|
|||
|
}
|
|||
|
#edge-translate-panel-body {
|
|||
|
color: var(--darkreader-neutral-text) !important;
|
|||
|
}</style>
|
|||
|
<script type="text/javascript">
|
|||
|
$(document).ready(function(){
|
|||
|
var $contenu = $('.toggle_container');
|
|||
|
$contenu.hide();
|
|||
|
|
|||
|
$('h4.trigger').click(function(){
|
|||
|
$(this).toggleClass('active').next().slideToggle('slow');
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
$('#ouvrir').click(function() {
|
|||
|
$contenu.show('slow');
|
|||
|
return false;
|
|||
|
});
|
|||
|
|
|||
|
$('#fermer').click(function() {
|
|||
|
$contenu.hide('slow');
|
|||
|
return false;
|
|||
|
});
|
|||
|
});
|
|||
|
</script>
|
|||
|
|
|||
|
<script type="text/javascript">/*! jQuery v1.8.3 jquery.com | jquery.org/license */
|
|||
|
(function(e,t){function _(e){var t=M[e]={};
|
|||
|
return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r<i;r++)v.event.add(t,n,u[n][r])}o.data&&(o.data=v.extend({},o.data))}function Ot(e,t){var n;if(t.nodeType!==1)return;t.clearAttributes&&t.clearAttributes(),t.mergeAttributes&&t.mergeAttributes(e),n=t.nodeName.toLowerCase(),n==="object"?(t.parentNode&&(t.outerHTML=e.outerHTML),v.support.html5Clone&&e.innerHTML&&!v.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):n==="input"&&Et.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):n==="option"?t.selected=e.defaultSelected:n==="input"||n==="textarea"?t.defaultValue=e.defaultValue:n==="script"&&t.text!==e.text&&(t.text=e.text),t.removeAttribute(v.expando)}function Mt(e){return typeof e.getElementsByTagName!="undefined"?e.getElementsByTagName("*"):typeof e.querySelectorAll!="undefined"?e.querySelectorAll("*"):[]}function _t(e){Et.test(e.type)&&(e.defaultChecked=e.checked)}function Qt(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Jt.length;while(i--){t=Jt[i]+n;if(t in e)return t}return r}function Gt(e,t){return e=t||e,v.css(e,"display")==="none"||!v.contains(e.ownerDocument,e)}function Yt(e,t){var n,r,i=[],s=0,o=e.length;for(;s<o;s++){n=e[s];if(!n.style)continue;i[s]=v._data(n,"olddisplay"),t?(!i[s]&&n.style.display==="none"&&(n.style.display=""),n.style.display===""&&Gt(n)&&(i[s]=v._data(n,"olddisplay",nn(n.nodeName)))):(r=Dt(n,"display"),!i[s]&&r!=="none"&&v._data(n,"olddisplay",r))}for(s=0;s<o;s++){n=e[s];if(!n.style)continue;if(!t||n.style.display==="none"||n.style.display==="")n.style.display=t?i[s]||"":"none"}return e}function Zt(e,t,n){var r=Rt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function en(e,t,n,r){var i=n===(r?"border":"content")?4:t==="width"?1:0,s=0;for(;i<4;i+=2)n==="margin"&&(s+=v.css(e,n+$t[i],!0)),r?(n==="content"&&(s-=parseFloat(Dt(e,"padding"+$t[i]))||0),n!=="margin"&&(s-=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0)):(s+=parseFloat(Dt(e,"padding"+$t[i]))||0,n!=="padding"&&(s+=parseFloat(Dt(e,"border"+$t[i]+"Width"))||0));return s}function tn(e,t,n){var r=t==="width"?e.offsetWidth:e.offsetHeight,i=!0,s=v.support.boxSizing&&v.css(e,"boxSizing")==="border-box";if(r<=0||r==null){r=Dt(e,t);if(r<0||r==null)r=e.style[t];if(Ut.test(r))return r;i=s&&(v.support.boxSizingReliable||r===e.style[t]),r=parseFloat(r)||0}return r+en(e,t,n||(s?"border":"content"),i)+"px"}function nn(e){if(Wt[e])return Wt[e];var t=v("<"+e+">").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write("<!doctype html><html><body>"),Ht.close();t=Ht.body.appendChild(Ht.createEle
|
|||
|
|
|||
|
<script type="text/javascript">/*!
|
|||
|
* toc - jQuery Table of Contents Plugin
|
|||
|
* v0.3.2
|
|||
|
* http://projects.jga.me/toc/
|
|||
|
* copyright Greg Allen 2017
|
|||
|
* MIT License
|
|||
|
*/
|
|||
|
!function(a){a.fn.smoothScroller=function(b){b=a.extend({},a.fn.smoothScroller.defaults,b);
|
|||
|
var c=a(this);
|
|||
|
return a(b.scrollEl).animate({scrollTop:c.offset().top-a(b.scrollEl).offset().top-b.offset},b.speed,b.ease,function(){var a=c.attr("id");a.length&&(history.pushState?history.pushState(null,null,"#"+a):document.location.hash=a),c.trigger("smoothScrollerComplete")}),this},a.fn.smoothScroller.defaults={speed:400,ease:"swing",scrollEl:"body,html",offset:0},a("body").on("click","[data-smoothscroller]",function(b){b.preventDefault();var c=a(this).attr("href");0===c.indexOf("#")&&a(c).smoothScroller()})}(jQuery),function(a){var b={};a.fn.toc=function(b){var c,d=this,e=a.extend({},jQuery.fn.toc.defaults,b),f=a(e.container),g=a(e.selectors,f),h=[],i=e.activeClass,j=function(b,c){if(e.smoothScrolling&&"function"==typeof e.smoothScrolling){b.preventDefault();var f=a(b.target).attr("href");e.smoothScrolling(f,e,c)}a("li",d).removeClass(i),a(b.target).parent().addClass(i)},k=function(b){c&&clearTimeout(c),c=setTimeout(function(){for(var b,c=a(window).scrollTop(),f=Number.MAX_VALUE,g=0,j=0,k=h.length;j<k;j++){var l=Math.abs(h[j]-c);l<f&&(g=j,f=l)}a("li",d).removeClass(i),b=a("li:eq("+g+")",d).addClass(i),e.onHighlight(b)},50)};return e.highlightOnScroll&&(a(window).bind("scroll",k),k()),this.each(function(){var b=a(this),c=a(e.listType);g.each(function(d,f){var g=a(f);h.push(g.offset().top-e.highlightOffset);var i=e.anchorName(d,f,e.prefix);if(f.id!==i)if(f.id){a("<span/>").attr("id",i).insertBefore(g)}else f.id=i;var l=a("<a/>").text(e.headerText(d,f,g)).attr("href","#"+i).bind("click",function(c){a(window).unbind("scroll",k),j(c,function(){a(window).bind("scroll",k)}),b.trigger("selected",a(this).attr("href"))}),m=a("<li/>").addClass(e.itemClass(d,f,g,e.prefix)).append(l);c.append(m)}),b.html(c)})},jQuery.fn.toc.defaults={container:"body",listType:"<ul/>",selectors:"h1,h2,h3",smoothScrolling:function(b,c,d){a(b).smoothScroller({offset:c.scrollToOffset}).on("smoothScrollerComplete",function(){d()})},scrollToOffset:0,prefix:"toc",activeClass:"toc-active",onHighlight:function(){},highlightOnScroll:!0,highlightOffset:100,anchorName:function(c,d,e){if(d.id.length)return d.id;var f=a(d).text().replace(/[^a-z0-9]/gi," ").replace(/\s+/g,"-").toLowerCase();if(b[f]){for(var g=2;b[f+g];)g++;f=f+"-"+g}return b[f]=!0,e+"-"+f},headerText:function(a,b,c){return c.data("toc-title")||c.text()},itemClass:function(a,b,c,d){return d+"-"+c[0].tagName.toLowerCase()}}}(jQuery);</script>
|
|||
|
|
|||
|
|
|||
|
<script type="text/javascript">
|
|||
|
function isElementInViewport (el) {
|
|||
|
if (typeof jQuery === "function" && el instanceof jQuery) {
|
|||
|
el = el[0];
|
|||
|
}
|
|||
|
|
|||
|
var rect = el.getBoundingClientRect();
|
|||
|
|
|||
|
return (
|
|||
|
rect.top >= 0 &&
|
|||
|
rect.left >= 0 &&
|
|||
|
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(window).height() */
|
|||
|
rect.right <= (window.innerWidth || document.documentElement.clientWidth) /*or $(window).width() */
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
$(function(){
|
|||
|
$('#table-of-contents').toc({
|
|||
|
'highlightOffset': 0,
|
|||
|
|
|||
|
'smoothScrolling': function(target, options, callback) {
|
|||
|
var oldHist = history.pushState;
|
|||
|
var shouldRestore = false;
|
|||
|
|
|||
|
history.pushState = null;
|
|||
|
$(target).smoothScroller({
|
|||
|
offset: options.scrollToOffset
|
|||
|
}).on('smoothScrollerComplete', function() {
|
|||
|
callback();
|
|||
|
|
|||
|
if (shouldRestore) {
|
|||
|
history.pushState = oldHist;
|
|||
|
}
|
|||
|
shouldRestore = true;
|
|||
|
});
|
|||
|
},
|
|||
|
'onHighlight': function(el) {
|
|||
|
el.addClass('visited_after_load');
|
|||
|
if (!isElementInViewport(el)) {
|
|||
|
$('#table-of-contents').animate({
|
|||
|
scrollTop: el.offset().top
|
|||
|
}, 1000);
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
</script>
|
|||
|
|
|||
|
<script type="text/javascript">
|
|||
|
function CodeHighlightOn(elem, id)
|
|||
|
{
|
|||
|
var target = document.getElementById(id);
|
|||
|
if(null != target) {
|
|||
|
elem.cacheClassElem = elem.className;
|
|||
|
elem.cacheClassTarget = target.className;
|
|||
|
target.className = "code-highlighted";
|
|||
|
elem.className = "code-highlighted";
|
|||
|
}
|
|||
|
}
|
|||
|
function CodeHighlightOff(elem, id)
|
|||
|
{
|
|||
|
var target = document.getElementById(id);
|
|||
|
if(elem.cacheClassElem)
|
|||
|
elem.className = elem.cacheClassElem;
|
|||
|
if(elem.cacheClassTarget)
|
|||
|
target.className = elem.cacheClassTarget;
|
|||
|
}
|
|||
|
|
|||
|
</script>
|
|||
|
</head>
|
|||
|
|
|||
|
|
|||
|
<body>
|
|||
|
|
|||
|
<div id="content">
|
|||
|
|
|||
|
<header>
|
|||
|
<h1 class="title" id="toc-titre">Gestion des processus Unix</h1>
|
|||
|
</header>
|
|||
|
|
|||
|
<nav id="table-of-contents"><ul><li class="toc-h1 toc-active visited_after_load"><a href="#toc-titre">Gestion des processus Unix</a></li><li class="toc-h2"><a href="#titre-0">Unix : concepts fondamentaux</a></li><li class="toc-h2"><a href="#titre-1">1 Etape 1 : Les Processus</a></li><li class="toc-h3"><a href="#titre1-1">1.1 Identification : getpid() et getppid()</a></li><li class="toc-h3"><a href="#titre1-2">1.2 La primitive sleep()</a></li><li class="toc-h3"><a href="#titre1-3">1.3 La primitive exit()</a></li><li class="toc-h3"><a href="#titre1-4">1.4 Création d'un processus : fork()</a></li><li class="toc-h3"><a href="#titre1-5">1.5 Importance du exit()</a></li><li class="toc-h3"><a href="#titre1-6">1.6 Héritage des données</a></li><li class="toc-h3"><a href="#titre1-7">1.7 Héritage des descripteurs</a></li><li class="toc-h3"><a href="#titre1-8">1.8 Fils orphelin</a></li><li class="toc-h3"><a href="#titre1-9">1.9 Fils zombie</a></li><li class="toc-h3"><a href="#titre1-10">1.10 wait()</a></li><li class="toc-h3"><a href="#titre1-11">1.11 execl()</a></li><li class="toc-h3"><a href="#titre1-12">1.12 execv()</a></li><li class="toc-h3"><a href="#titre1-13">1.13 Conservation des descripteurs</a></li></ul></nav>
|
|||
|
|
|||
|
<div id="outline-container-0" class="outline-1">
|
|||
|
|
|||
|
<div class="org-center">
|
|||
|
<font style="--darkreader-inline-color:#6b4de1;" data-darkreader-inline-color="" color="#4020C0">
|
|||
|
Auteur: Zouheir HAMROUNI
|
|||
|
</font>
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<div id="outline-container-0" class="outline-2">
|
|||
|
<h2 id="titre-0"><span class="section-number-2"></span>Unix : concepts fondamentaux</h2>
|
|||
|
<div class="outline-text-2" id="text-0">
|
|||
|
<p>
|
|||
|
Unix met en oeuvre plusieurs concepts fondamentaux :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
Les processus : pour la gestion des traitements (exécutions de programmes).
|
|||
|
Ce concept encapsule l’exécution d’un programme de façon à assurer l’allocation et le contrôle
|
|||
|
des ressources nécessaires à cette exécution (processeur(s), mémoires,
|
|||
|
périphériques, fichiers, pipes, sockets…). Plusieurs processus peuvent
|
|||
|
exister en parallèle et se partager de façon optimisée ces ressources.
|
|||
|
</li>
|
|||
|
<br>
|
|||
|
<li>Les fichiers : pour la gestion des données, ce concept permet d’assurer une rémanence et
|
|||
|
un contrôle des données des usagers du système.
|
|||
|
</li>
|
|||
|
<br>
|
|||
|
<li>
|
|||
|
La gestion dynamique des processus et fichiers dans une structure
|
|||
|
arborescente. En effet, tout processus est un descendant d’un processus
|
|||
|
père, et appartient à une arborescence qui a pour racine le processus
|
|||
|
initial (numéro 1) ; et tout fichier est placé dans une arborescence de
|
|||
|
répertoires ayant une racine unique.
|
|||
|
</li>
|
|||
|
<br>
|
|||
|
<li>La protection des ressources : Tout processus s’exécute pour un usager appartenant à un groupe.
|
|||
|
Tout fichier possède de la même manière un créateur identifié. L’identification d’un usager
|
|||
|
définit ainsi une capacité d’accès de cet usager aux ressources du système via les processus
|
|||
|
qu’il engendrera.
|
|||
|
</li>
|
|||
|
<br>
|
|||
|
<li>
|
|||
|
La transparence de l’architecture matérielle : ce principe consiste à masquer
|
|||
|
les particularités des architectures supports. Le noyau système définit par exemple un système
|
|||
|
de gestion d’exceptions (déroutements et interruptions), et des signaux indépendants de tout
|
|||
|
processeur matériel.
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div id="outline-container-1" class="outline-2">
|
|||
|
<h2 id="titre-1"><span class="section-number-2">1 </span>Etape 1 : Les Processus</h2>
|
|||
|
Un processus est une instance d'exécution d'un programme (un programme
|
|||
|
en cours d'exécution). Ce concept encapsule l’exécution d’un programme
|
|||
|
de manière à assurer l’allocation et le contrôle
|
|||
|
des ressources nécessaires à cette exécution (temps processeur, mémoire,
|
|||
|
|
|||
|
périphériques, fichiers, pipes, sockets…). Plusieurs processus peuvent
|
|||
|
exister en parallèle et se partager de façon optimisée ces ressources.
|
|||
|
<p>
|
|||
|
Les processus sont organisés dans une structure arborescente : tout
|
|||
|
processus est un descendant d’un processus père, et appartient à une
|
|||
|
arborescence qui a pour racine le processus initial.
|
|||
|
</p><p>
|
|||
|
Chaque processus Unix possède un numéro "pid" (process id), et un
|
|||
|
processus père (son créateur, et son supérieur dans l'arborescence des
|
|||
|
processus). Le processus initial (racine de l'arborescence) porte le
|
|||
|
numéro 1.
|
|||
|
</p><p>
|
|||
|
Nous allons nous intéresser aux primitives de base de gestion des
|
|||
|
processus. Par défaut, et sauf précision contraire, ces primitives sont
|
|||
|
définies dans "unistd.h", fichier à référencer en début du code.
|
|||
|
</p><pre><font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>unistd.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font>
|
|||
|
</pre>
|
|||
|
|
|||
|
<div id="outline-container-1-1" class="outline-3">
|
|||
|
<h3 id="titre1-1"><span class="section-number-3">1.1 </span>Identification : getpid() et getppid()</h3>
|
|||
|
<div class="outline-text-3" id="text-1-1">
|
|||
|
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
<methode>pid_t getpid()</methode> : retourne le pid du processus appelant (pid_t : synonyme d'entier).
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<methode>pid_t getppid()</methode> : retourne le pid du père du processus appelant.
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p>Chaque processus peut donc connaître son numéro (pid) et le numéro de son père (ppid).
|
|||
|
</p></div>
|
|||
|
</div>
|
|||
|
|
|||
|
<div id="outline-container-1-2" class="outline-3">
|
|||
|
<h3 id="titre1-2"><span class="section-number-3">1.2 </span>La primitive sleep()</h3>
|
|||
|
<div class="outline-text-3" id="text-1-2">
|
|||
|
|
|||
|
<methode>unsigned int sleep(int n)</methode> : endort le processus
|
|||
|
appelant pour une durée de n secondes. Cette durée peut être écourtée
|
|||
|
dès qu'un signal non ignoré est reçu.
|
|||
|
<p>
|
|||
|
<methode>sleep()</methode> renvoie zéro si le temps prévu s'est écoulé, ou le nombre de secondes restantes si l'appel a été interrompu.
|
|||
|
</p><p>
|
|||
|
Nous l'utiliserons pour faire durer les processus testés pendant un temps choisi.
|
|||
|
|
|||
|
</p></div>
|
|||
|
</div>
|
|||
|
|
|||
|
<div id="outline-container-1-3" class="outline-3">
|
|||
|
<h3 id="titre1-3"><span class="section-number-3">1.3 </span>La primitive exit()</h3>
|
|||
|
<div class="outline-text-3" id="text-1-3">
|
|||
|
|
|||
|
<methode>void exit(int n)</methode> : met fin au processus appelant avec n comme code de retour.
|
|||
|
<p>Par convention, le code de retour est :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
est égal à 0 (EXIT_SUCCESS : constante prédéfinie) après un comportement correct
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
est différent de 0 pour indiquer une erreur
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<div id="outline-container-1-4" class="outline-3">
|
|||
|
<h3 id="titre1-4"><span class="section-number-3">1.4 </span>Création d'un processus : fork()</h3>
|
|||
|
<div class="outline-text-3" id="text-1-4">
|
|||
|
Un processus peut créer un fils en appelant la primitive fork() :
|
|||
|
<p>
|
|||
|
<methode>pid_t fork()</methode> : crée dynamiquement un nouveau processus (fils) qui s'exécute de façon
|
|||
|
concurrente avec le processus qui le crée (processus père). Ce processus fils hérite du processus
|
|||
|
père les attributs suivants :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
même code
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
une copie de la zone de données du père
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
environnement d'exécution
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
priorité
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
descripteurs de fichiers ouverts
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
traitement des signaux
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
Après exécution du <methode>fork()</methode>, on se trouve avec deux processus (un père et un fils)
|
|||
|
ayant le même code et
|
|||
|
la même image de données. En cas de succès, la primitive <methode>fork()</methode> renvoie deux valeurs différentes :
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
dans le code du père : la valeur de retour indique le pid du fils créé (>0)
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
dans le code du fils : la valeur de retour est égale à 0
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
|
|||
|
En cas d'échec (nombre maximum de processus atteint) : aucun fils n'est créé et la valeur de retour du <methode>fork()</methode> est égale à -1
|
|||
|
|
|||
|
|
|||
|
<p>Même si le père et son fils ont le même code, on peut différencier les traitements effectués
|
|||
|
par l'un et par l'autre en se basant sur la valeur de retour du fork.
|
|||
|
</p><p>
|
|||
|
Le code suivant illustre ce concept : le processus principal crée 3 fils, en
|
|||
|
répétant le même traitement à l'intérieur d'une boucle "for" dans laquelle il passe 3 fois.
|
|||
|
</p><p>
|
|||
|
Au premier passage (fils=1), le processus principal exécute la primitive <methode>fork()</methode>,
|
|||
|
dont on doit traiter les 3 cas de retour :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
retour = -1 : le <methode>fork()</methode> a échoué et aucun fils n'a été créé. Dans ce cas, le processus principal s'arrête en faisant appel à la primitive <methode>exit()</methode> et en y indiquant une valeur d'arrêt différente de 0 (par convention). Il est important
|
|||
|
de prévoir le traitement du retour d'erreur de toute primitive système.
|
|||
|
</li>
|
|||
|
<br>
|
|||
|
<li>
|
|||
|
retour >= 0 : le <methode>fork()</methode> a créé un processus fils qui hérite du même code que son père. La valeur de retour n'est pas la même dans les deux codes :
|
|||
|
</li>
|
|||
|
<br>
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
retour = 0 : on se trouve dans le code du fils, qui va exécuter la séquence à l'intérieur du
|
|||
|
"if (retour == 0)" :
|
|||
|
</li>
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
affiche son numéro, son pid et le pid de son père
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
s'endort pendant 3 secondes
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
et s'arrête en faisant appel à la primitive <methode>exit()</methode>. Par conséquent, le fils,
|
|||
|
même s'il hérite de la
|
|||
|
totalité du code de son père, ne va jamais entrer de nouveau dans la boucle "for".
|
|||
|
Nous verrons plus loin ce qu'il se passe si on enlève l'appel à <methode>exit()</methode>.
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p>
|
|||
|
</p><li>
|
|||
|
retour > 0 : on se trouve dans le code du père, qui affiche le numéro et le pid du fils qu'il vient
|
|||
|
de créer, et repart dans la boucle "for".
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</ul>
|
|||
|
Le même traitement se répète lors du deuxième et du troisième passage dans la boucle "for".
|
|||
|
<p>
|
|||
|
</p><pre> 1 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Exemple d'illustration des primitives Unix : Un père et ses fils */</font>
|
|||
|
2 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Création de fils : fork et exit */</font>
|
|||
|
3
|
|||
|
4 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdio.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* entrées sorties */</font>
|
|||
|
5 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>unistd.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pimitives de base : fork, ...*/</font>
|
|||
|
6 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdlib.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exit */</font>
|
|||
|
7
|
|||
|
8 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#define</font> NB_FILS 3 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* nombre de fils */</font>
|
|||
|
9
|
|||
|
10 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> main<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>
|
|||
|
11 {
|
|||
|
12 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> fils, retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
13 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> duree_sommeil <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 2 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
14
|
|||
|
15 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nJe suis le processus principal de pid %d\n"</font>, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
16
|
|||
|
17 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
18 retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> fork<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
19
|
|||
|
20 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Bonne pratique : tester systématiquement le retour des appels système */</font>
|
|||
|
21 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* échec du fork */</font>
|
|||
|
22 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Erreur fork\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
23 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Convention : s'arrêter avec une valeur <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> 0 en cas d'erreur */</font>
|
|||
|
24 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
25 }
|
|||
|
26
|
|||
|
27 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils */</font>
|
|||
|
28 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
29 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d, de pid %d, de pere %d.\n"</font>,
|
|||
|
30 fils, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, getppid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
31 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>duree_sommeil<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
32 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Important : terminer un processus par exit */</font>
|
|||
|
33 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>EXIT_SUCCESS<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Terminaison normale <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>0 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> sans erreur<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> */</font>
|
|||
|
34 }
|
|||
|
35
|
|||
|
36 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pere */</font>
|
|||
|
37 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> {
|
|||
|
38 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus de pid %d a cree un fils numero %d, de pid %d \n"</font>,
|
|||
|
39 getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, fils, retour<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
40 }
|
|||
|
41 }
|
|||
|
42 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>duree_sommeil<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
43 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">return</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">EXIT_SUCCESS</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
44 }
|
|||
|
</pre>
|
|||
|
|
|||
|
<p>Pour valider cet exercice, il faut :
|
|||
|
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
Compiler le code ci-dessus : gcc -Wall -o nom_executable pere_fils.c
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
lancer l'outil de validation "apisys" dans un terminal shell
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
se placer sur le bon exercice (commandes p et s) et lancer son exécution
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
répondre aux questions posées
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
|
|||
|
<h4 class="trigger"> <a href="#">Visualiser l'interprétation des résultats</a></h4>
|
|||
|
<section class="toggle_container" style="display: none;">
|
|||
|
<p>
|
|||
|
En exécutant ce code, on peut voir 7 messages affichés à l'écran :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
4 messages affichés par le père : 1 avant la boucle "for", et 1 à chaque passage dans la boucle "for"
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
1 message affiché par chaque fils
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
En répétant l'exécution plusiuers fois, on peut remarquer que ces 7 messages ne
|
|||
|
s'affichent pas toujours dans le même ordre. Car l'ordonnancement des processus
|
|||
|
n'est pas le même d'une exécution à l'autre.
|
|||
|
|
|||
|
<p>
|
|||
|
En exécutant ce code, et en tapant rapidement la commande "ps l" dans un
|
|||
|
autre termianl (avant l'expiration des 3 secondes), on peut vérifier
|
|||
|
l'existante des 4 processus, et leurs liens de paranté (colonnes PID et
|
|||
|
PPID).
|
|||
|
</p></section>
|
|||
|
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<div id="outline-container-1-5" class="outline-3">
|
|||
|
<h3 id="titre1-5"><span class="section-number-3">1.5 </span>Importance du <methode>exit()</methode></h3>
|
|||
|
<div class="outline-text-3" id="text-1-5">
|
|||
|
|
|||
|
<p>Dans l'exemple dessus, le code du fils est délimité entre le "if (retour == 0)" et <methode>exit(EXIT_SUCCESS)</methode>. Ce qui permet de séparer clairement le code exécuté par le père de celui du fils.
|
|||
|
</p><p>
|
|||
|
Si on reprend le même code que dessus et on supprime le <methode>exit(EXIT_SUCCESS)</methode>, on abtient un comprtement très différent des fils.
|
|||
|
</p><pre> 1 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Exemple d'illustration des primitives Unix : Un père et ses fils */</font>
|
|||
|
2 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Absence du exit dans le fils, et conséquences */</font>
|
|||
|
3
|
|||
|
4 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdio.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* entrées sorties */</font>
|
|||
|
5 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>unistd.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pimitives de base : fork, ...*/</font>
|
|||
|
6 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdlib.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exit */</font>
|
|||
|
7
|
|||
|
8 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#define</font> NB_FILS 3 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* nombre de fils */</font>
|
|||
|
9
|
|||
|
10 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> main<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>
|
|||
|
11 {
|
|||
|
12 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> fils, retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
13 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> duree_sommeil <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 3 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
14
|
|||
|
15 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nJe suis le processus principal de pid %d\n"</font>, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
16
|
|||
|
17 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
18 retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> fork<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
19
|
|||
|
20 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Bonne pratique : tester systématiquement le retour des appels système */</font>
|
|||
|
21 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
22 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Erreur fork\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
23 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Convention : s'arrêter avec une valeur <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> 0 en cas d'erreur */</font>
|
|||
|
24 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
25 }
|
|||
|
26
|
|||
|
27 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils */</font>
|
|||
|
28 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
29 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d, de pid %d, de pere %d.\n"</font>,
|
|||
|
30 fils, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, getppid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
31 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Le fils ne s'arrete pas ici */</font>
|
|||
|
32 }
|
|||
|
33
|
|||
|
34 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pere */</font>
|
|||
|
35 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> {
|
|||
|
36 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus de pid %d a cree un fils numero %d, de pid %d \n"</font>,
|
|||
|
37 getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, fils, retour<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
38 }
|
|||
|
39 }
|
|||
|
40 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>duree_sommeil<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
41 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">return</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">EXIT_SUCCESS</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
42 }
|
|||
|
</pre>
|
|||
|
|
|||
|
<p>
|
|||
|
Testez ce code dans l'outil "apisys" (comme indiqué plus haut), et répondez aux questions posées.
|
|||
|
</p><h4 class="trigger"> <a href="#">Visualiser l'interprétation des résultats</a></h4>
|
|||
|
<section class="toggle_container" style="display: none;">
|
|||
|
<p>
|
|||
|
</p><p>A l'exécution de ce code, on obtient le comportement suivant :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
lors du premier passage dans la boucle, le processus principal (père) crée un premier fils (que l'on appellera fils_1),
|
|||
|
qui continue à exécuter le code de la boucle "for", car il n'y a plus d'exit qui l'arrête :
|
|||
|
donc deux processus qui vont exécuter le deuxième passage de laboucle "for"
|
|||
|
</li>
|
|||
|
<p>
|
|||
|
</p><li>
|
|||
|
lors du dexième passage dans la boucle (père et fils_1) :
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
le processus père crée un dexième fils (fils_2)
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
le porcessus fils_1 crée un fils que l'on nommera petit_fils_1_1
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
lors du troisième passage dans la boucle (père, fils_1, fils_2 et petit_fils_1_1) :
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
le processus père crée un troisième fils (fils_3)
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
le porcessus fils_1 crée un deuxième fils que l'on nommera petit_fils_1_2
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
le porcessus fils_2 crée un fils que l'on nommera petit_fils_2_1
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
le porcessus petit_fils_1_1 crée un fils que l'on nommera arrière_petit_fils_1_1
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<p>
|
|||
|
</p><li>
|
|||
|
Et s'il y avait un éventuel quatrième passage, 8 nouveaux processus seraient créés,
|
|||
|
donc doublement du nombre de processus à chaque nouveau passge dans la boucle !
|
|||
|
</li></ul>
|
|||
|
</section>
|
|||
|
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
<div id="outline-container-1-6" class="outline-3">
|
|||
|
<h3 id="titre1-6"><span class="section-number-3">1.6 </span>Héritage des données</h3>
|
|||
|
<div class="outline-text-3" id="text-1-6">
|
|||
|
Comme indiqué dessus, le processus fils hérite d'une copie de la zone de données de son père.
|
|||
|
Il possède donc une copie de toutes les variables du code. Pour une variable donnée,
|
|||
|
la valeur vue par le fils est la même que celle vue par le père tant que cette variable
|
|||
|
n'est pas modifiée. Car dès que la avriable est modifiée par le père ou par le fils,
|
|||
|
la copie du fils devient forcément différente de celle du père.
|
|||
|
<p>
|
|||
|
Le code suivant reprend le premier code présenté plus haut en ajoutant une variable appelée "patrimoine_fils",
|
|||
|
que le père initialise à 10000, comme cadeau de naissance qu'il réserve à chaque nouveau fils.
|
|||
|
</p><p>
|
|||
|
Chaque fils, fait fructifier son patrimoine, modifie donc la variable patrimoine_fils, et l'affiche avant de s'arrêter.
|
|||
|
</p><p>
|
|||
|
De son côté, le père essaie de calculer le patrimoine total de ses fils en lisant la variable
|
|||
|
patrimoine_fils, mais malheureusement pour lui, il n'a accès qu'à sa propore copie, et pas
|
|||
|
à celles de ses fils.
|
|||
|
</p><pre> 1 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Exemple d'illustration des primitives Unix : Un père et ses fils */</font>
|
|||
|
2 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Héritage et dupplication des données */</font>
|
|||
|
3
|
|||
|
4 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdio.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* entrées sorties */</font>
|
|||
|
5 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>unistd.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pimitives de base : fork, ...*/</font>
|
|||
|
6 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdlib.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exit */</font>
|
|||
|
7
|
|||
|
8 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#define</font> NB_FILS 3 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* nombre de fils */</font>
|
|||
|
9 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#define</font> DELAI 3
|
|||
|
10
|
|||
|
11 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> main<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>
|
|||
|
12 {
|
|||
|
13 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> fils, retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
14 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> cagnotte, patrimoine_fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
15 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> duree_sommeil <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 3 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
16 cagnotte <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 30000 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
17 patrimoine_fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> cagnotte / NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
18
|
|||
|
19 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nJe suis le processus principal de pid %d\n"</font>, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
20 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Je dispose de %d Euros, que je partage entre mes futurs fils\n"</font>, cagnotte<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
21
|
|||
|
22 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
23 retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> fork<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
24
|
|||
|
25 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Bonne pratique : tester systématiquement le retour des appels système */</font>
|
|||
|
26 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* échec du fork */</font>
|
|||
|
27 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Erreur fork\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
28 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
29 }
|
|||
|
30
|
|||
|
31 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils */</font>
|
|||
|
32 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
33 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d : mon pere m'a offert %d Euros\n"</font>,
|
|||
|
34 fils, patrimoine_fils<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
35 patrimoine_fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> patrimoine_fils * <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils + 1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
36 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>duree_sommeil<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
37 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d - j'ai augmente mon patrimoine a %d Euros\n"</font>,
|
|||
|
38 fils, patrimoine_fils<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
39 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>EXIT_SUCCESS<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Te:rminaison normale <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>0 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> sans erreur<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> */</font>
|
|||
|
40 }
|
|||
|
41
|
|||
|
42 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pere */</font>
|
|||
|
43 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> {
|
|||
|
44 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus de pid %d a cree un fils numero %d, de pid %d \n"</font>,
|
|||
|
45 getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, fils, retour<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
46 }
|
|||
|
47 }
|
|||
|
48 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>duree_sommeil+1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
49
|
|||
|
50 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus Principal - le patrimoine total de mes fils est de %d\n"</font>, patrimoine_fils*NB_FILS<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
51 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">return</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">EXIT_SUCCESS</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
52 }
|
|||
|
</pre>
|
|||
|
|
|||
|
<p>
|
|||
|
Testez ce code dans l'outil "apisys" (comme indiqué plus haut), et répondez aux questions posées.
|
|||
|
</p><h4 class="trigger"> <a href="#">Visualiser l'interprétation des résultats</a></h4>
|
|||
|
<section class="toggle_container" style="display: none;">
|
|||
|
<p>A l'exécution de ce code, on vérifie bien que la variable
|
|||
|
patrimoine_fils n'a plus la même valeur dans le père et dans les fils,
|
|||
|
dès qu'elle est modifiée par l'un ou par l'autre. Le père conserve sa
|
|||
|
copie initiale et n'a
|
|||
|
aucun accès aux copies modifiées par ses fils.
|
|||
|
|
|||
|
</p></section>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
<div id="outline-container-1-7" class="outline-3">
|
|||
|
<h3 id="titre1-7"><span class="section-number-3">1.7 </span>Héritage des descripteurs</h3>
|
|||
|
<div class="outline-text-3" id="text-1-7">
|
|||
|
<p>
|
|||
|
Chaque processus échange des informations avec son environnement (écran, clavier,
|
|||
|
fichiers, etc) sous la forme de suites d’octets (ou flots d’entrées/sorties).
|
|||
|
L'accès à chaque canal de communication (lecture/écriture) se fait par l'intermédiaire d'un descripteur (numéro >=0).
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
Par défaut, Unix/Linux gère trois flots d’entrée/sortie :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
l’entrée standard (flot numéro 0), <code>stdin</code>, associée au clavier,
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
la sortie standard (flot numéro 1), <code>stdout</code>, associée à l’écran,
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
la sortie erreur standard (flot numéro 2), <code>stderr</code>, associée aussi à l’écran.
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<div class="encadreblanc">
|
|||
|
Il est possible de modifier ces associations pour un processus : par exemple, associer la sortie
|
|||
|
standad à un fichier, de manère à ce que les messages ne s'affichent plus à l'écran,
|
|||
|
mais s'écrivent dans ce fichier.
|
|||
|
<p>Cette modification ne nécessite pas la modification du code,
|
|||
|
et se fait simplement avec un mécanisme appelé redirection :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
la sortie standard peut être redéfinie à l’aide du caractère <code>></code> : dans la commande
|
|||
|
suivante, le résultat du <code>ls</code> est redirigé dans le fichier <i>fic</i>
|
|||
|
<pre><code>ls ></code> <i>fic</i>
|
|||
|
</pre>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
il est possible d'ajouter à un fichier le résultat d'une commande : dans la commande suivante,
|
|||
|
le résultat du <code>ls -l</code> s'ajoute au fichier <i>fic</i>
|
|||
|
<pre><code>ls -l >></code> <i>fic</i>
|
|||
|
</pre>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
en Bourne shell, sh ou bash, la sortie erreur standard peut être redirigée par
|
|||
|
<code>2></code> : la commande suivante écrit les messages d’erreurs éventuellement
|
|||
|
engendrés par l’exécution de <code>rm</code> dans le fichier <i>fic</i>
|
|||
|
<pre><code>rm toto 2></code> <i>ficerreur</i>
|
|||
|
</pre>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
l’entrée standard peut être redirigée par <code><</code> : les commandes suivantes
|
|||
|
réalisent une lecture d'un caractère au clavier et son affichage, en passant par la variable c
|
|||
|
<pre><code>read c; echo $c </code>
|
|||
|
</pre>
|
|||
|
Dans cette seconde version, la lecture est faite dans le fichier <i>fic</i>
|
|||
|
<pre><code>read c <</code> <i>fic</i> <code>; echo $c </code>
|
|||
|
</pre>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</div>
|
|||
|
<p>Un processus fils hérite de tous les descripteurs ouverts dans son père (entrées/sorties
|
|||
|
standard, fichiers, etc.).
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
Nous avons vu lors des exécutions précédentes que les messages
|
|||
|
du père et ceux des différents fils sont affichés dans le même terminal (sortie standard).
|
|||
|
</li>
|
|||
|
<p>
|
|||
|
</p><li>
|
|||
|
De même, tout descripteur de fichier ouvert par le père est hérité par ses fils,
|
|||
|
y compris lorsque ce fichier est ouvert par redirection.
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p>
|
|||
|
Pour illustrer cela, on reprend le premier programme pere_fils.c et on l'exécute en redirigeant
|
|||
|
la sortie standard dans un fichier : (pere_fils > fic_sortie).
|
|||
|
</p><p>Après exécution, on peut remarquer :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
aucun message n'est affiché dans le terminal d'exécution
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
les messages qui devaient s'afficher dans le terminal d'exécution se trouvent
|
|||
|
maintenant dans le fichier "fic_sortie"
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
mais, certains messages sont en double ou en triple
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p>L'explication de ce dernier point, se trouve dans le fonctionnement du "printf".
|
|||
|
D'après le standard ISO, le comprtement du "printf" n'est pas le même pour la sortie
|
|||
|
standard et pour un fichier ordinaire :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
dans le cas d'une sortie interactive (terminal), le flot est géré par ligne
|
|||
|
et \n provoque la vidange du tampon langage
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
dans le cas d'une sortie dans un fichier ordinaire, le flot est géré par
|
|||
|
bloc
|
|||
|
(pour limiter les échanges avec le fichier) : '\n' est traité comme un
|
|||
|
caractère ordinaire et ne commande plus la vidange du buffer.
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p>
|
|||
|
Chaque fils hérite du tampon (zone mémoire) de sortie du père, qui contient les messages
|
|||
|
déjà envoyés par le père et non vidangés, auxquels va s'ajouter le message du fils.
|
|||
|
Par conséquent, chaque fils va envoyer un flot de données contenant, en plus de son propre
|
|||
|
message, les messages antérieurs du père. C'est pour cela que certains messages se
|
|||
|
strouvent en 3 exemplaires (réaffichés par les fils 2 et 3), et d'autres en double
|
|||
|
exemplaire (réaffichés par le fils 3).
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
Le fis nuéro 1 récupère un tampon qui contient le premeir message du père
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
Le fis nuéro 2 récupère un tampon qui contient
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
le premeir message du père
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
le message affiché par le père lors du premier passage dans la boucle
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
Le fis nuéro 3 récupère un tampon qui contient
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
le premeir message du père
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
le message affiché par le père lors du premier passage dans la boucle
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
le message affiché par le père lors du deuxième passage dans la boucle
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p>
|
|||
|
Pour forcer la vidange du tampon de sortie, on fait un appel explicite à <methode>fflush(stdout)</methode> après
|
|||
|
chaque printf du père. Ainsi, le fils créé hérite d'un tampon vide et ne dupplique plus
|
|||
|
l'affichage des messages de son père.
|
|||
|
</p><pre> 1 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Exemple d'illustration des primitives Unix : Un père et ses fils */</font>
|
|||
|
2 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Redirection et fflush */</font>
|
|||
|
3
|
|||
|
4 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdio.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* entrées sorties */</font>
|
|||
|
5 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>unistd.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pimitives de base : fork, ...*/</font>
|
|||
|
6 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdlib.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exit */</font>
|
|||
|
7
|
|||
|
8 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#define</font> NB_FILS 3 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* nombre de fils */</font>
|
|||
|
9
|
|||
|
10 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> main<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>
|
|||
|
11 {
|
|||
|
12 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> fils, retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
13 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> duree_sommeil <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 2 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
14
|
|||
|
15 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nJe suis le processus principal de pid %d\n"</font>, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
16
|
|||
|
17 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Vidange du tampon de sortie pour que le fils le récupère vide */</font>
|
|||
|
18 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* D'après le standard ISO le comportement du printf présente 2 cas : */</font>
|
|||
|
19 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* - sortie interactive <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>terminal<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> : flot géré par ligne et \n provoque */</font>
|
|||
|
20 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* la vidange du tampon langage </font>
|
|||
|
21 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* - sortie dans un fichier : flot géré par bloc et \n est traité comme */</font>
|
|||
|
22 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* un caractère ordinaire. fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> force la vidange du tampon. */</font>
|
|||
|
23
|
|||
|
24 fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
25
|
|||
|
26 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
27 retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> fork<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
28
|
|||
|
29 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Bonne pratique : tester systématiquement le retour des appels système */</font>
|
|||
|
30 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* échec du fork */</font>
|
|||
|
31 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Erreur fork\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
32 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Convention : s'arrêter avec une valeur <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> 0 en cas d'erreur */</font>
|
|||
|
33 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
34 }
|
|||
|
35
|
|||
|
36 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils */</font>
|
|||
|
37 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
38 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d, de pid %d, de pere %d.\n"</font>,
|
|||
|
39 fils, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, getppid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
40 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>duree_sommeil<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
41 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Important : terminer un processus par exit */</font>
|
|||
|
42 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>EXIT_SUCCESS<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Terminaison normale <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>0 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> sans erreur<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> */</font>
|
|||
|
43 }
|
|||
|
44
|
|||
|
45 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pere */</font>
|
|||
|
46 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> {
|
|||
|
47 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus de pid %d a cree un fils numero %d, de pid %d \n"</font>,
|
|||
|
48 getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, fils, retour<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
49 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* vidange du tampon de sortie pour que le fils le récupère vide */</font>
|
|||
|
50 fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
51 }
|
|||
|
52 }
|
|||
|
53 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>duree_sommeil<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
54 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">return</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">EXIT_SUCCESS</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
55 }
|
|||
|
|
|||
|
</pre>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<p>Testez ce code dans l'outil "apisys" et vérifiez que les messages ne sont
|
|||
|
plus duppliqués.
|
|||
|
|
|||
|
</p><div id="outline-container-1-8" class="outline-3">
|
|||
|
<h3 id="titre1-8"><span class="section-number-3">1.8 </span>Fils orphelin</h3>
|
|||
|
<div class="outline-text-3" id="text-1-8">
|
|||
|
<p>
|
|||
|
Lorsque le processus père se termine (disparait) avant son fils, ce dernier devient orphelin,
|
|||
|
et est rattaché (adopté) au processus initial portant le numéro 1.
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
On reprend le programme initial pere_fils.c, et on fait durer les fils plus
|
|||
|
longtemps que le père, en agissant sur le paramètre du sleep.
|
|||
|
</p><pre> 1 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Exemple d'illustration des primitives Unix : Un père et ses fils */</font>
|
|||
|
2 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Fils orphelins */</font>
|
|||
|
3
|
|||
|
4 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdio.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* entrées sorties */</font>
|
|||
|
5 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>unistd.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pimitives de base : fork, ...*/</font>
|
|||
|
6 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdlib.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exit */</font>
|
|||
|
7
|
|||
|
8 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#define</font> NB_FILS 3 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* nombre de fils */</font>
|
|||
|
9
|
|||
|
10 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> main<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>
|
|||
|
11 {
|
|||
|
12 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> fils, retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
13 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> duree_sommeil <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 120 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
14
|
|||
|
15 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nJe suis le processus principal de pid %d\n"</font>, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
16
|
|||
|
17 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
18 retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> fork<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
19
|
|||
|
20 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Bonne pratique : tester systématiquement le retour des appels système */</font>
|
|||
|
21 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* échec du fork */</font>
|
|||
|
22 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Erreur fork\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
23 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Convention : s'arrêter avec une valeur <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> 0 en cas d'erreur */</font>
|
|||
|
24 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
25 }
|
|||
|
26
|
|||
|
27 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils */</font>
|
|||
|
28 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
29 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d, de pid %d, de pere %d.\n"</font>,
|
|||
|
30 fils, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, getppid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
31 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>duree_sommeil<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
32 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>EXIT_SUCCESS<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Terminaison normale */</font>
|
|||
|
33 }
|
|||
|
34
|
|||
|
35 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pere */</font>
|
|||
|
36 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> {
|
|||
|
37 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus de pid %d a cree un fils numero %d, de pid %d \n"</font>,
|
|||
|
38 getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, fils, retour<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
39 }
|
|||
|
40 }
|
|||
|
41 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
42 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">return</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">EXIT_SUCCESS</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
43 }
|
|||
|
</pre>
|
|||
|
<p>
|
|||
|
Si on exécute ce nouveau code, et on tape
|
|||
|
la commande "ps l" dans un autre terminal, on peut voir dans la colonne "PPID"
|
|||
|
du tableau affiché, que les 3 fils ont pour père le processus 1.
|
|||
|
|
|||
|
</p></div>
|
|||
|
</div>
|
|||
|
|
|||
|
<div id="outline-container-1-9" class="outline-3">
|
|||
|
<h3 id="titre1-9"><span class="section-number-3">1.9 </span>Fils zombie</h3>
|
|||
|
<div class="outline-text-3" id="text-1-9">
|
|||
|
<p>
|
|||
|
Lorsque un processus fils se termine sans que son père prenne connaissance de cette
|
|||
|
terminaison, ce fils reste présent et entre dans un état zombie.
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
On reprend le programme initial pere_fils.c, et on fait durer le père plus
|
|||
|
longtemps que les fils, en agissant sur le paramètre du sleep.
|
|||
|
</p><pre> 1 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Exemple d'illustration des primitives Unix : Un père et ses fils */</font>
|
|||
|
2 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Fils Zombie */</font>
|
|||
|
3
|
|||
|
4 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdio.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* entrées sorties */</font>
|
|||
|
5 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>unistd.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pimitives de base : fork, ...*/</font>
|
|||
|
6 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdlib.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exit */</font>
|
|||
|
7
|
|||
|
8 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#define</font> NB_FILS 3 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* nombre de fils */</font>
|
|||
|
9
|
|||
|
10 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> main<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>
|
|||
|
11 {
|
|||
|
12 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> fils, retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
13 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> duree_sommeil <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 120 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
14
|
|||
|
15 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nJe suis le processus principal de pid %d\n"</font>, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
16
|
|||
|
17 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
18 retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> fork<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
19
|
|||
|
20 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Bonne pratique : tester systématiquement le retour des appels système */</font>
|
|||
|
21 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* échec du fork */</font>
|
|||
|
22 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Erreur fork\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
23 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
24 }
|
|||
|
25
|
|||
|
26 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils */</font>
|
|||
|
27 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
28 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d, de pid %d, de pere %d.\n"</font>,
|
|||
|
29 fils, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, getppid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
30 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>EXIT_SUCCESS<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Terminaison normale */</font>
|
|||
|
31 }
|
|||
|
32
|
|||
|
33 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pere */</font>
|
|||
|
34 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> {
|
|||
|
35 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus de pid %d a cree un fils numero %d, de pid %d \n"</font>,
|
|||
|
36 getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, fils, retour<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
37 }
|
|||
|
38 }
|
|||
|
39 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>duree_sommeil<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
40 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">return</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">EXIT_SUCCESS</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
41 }
|
|||
|
</pre>
|
|||
|
<p>
|
|||
|
Si on exécute ce nouveau code, et on tape
|
|||
|
la commande "ps l" dans un autre terminal, on peut voir dans la colonne STAT
|
|||
|
du tableau affiché, que les 3 fils sont dans l'état zombie (Z, ou Z+) et dans la
|
|||
|
dernière colonne le terme "defunct" ajouté après leur nom.
|
|||
|
|
|||
|
</p></div>
|
|||
|
</div>
|
|||
|
|
|||
|
<div id="outline-container-1-10" class="outline-3">
|
|||
|
<h3 id="titre1-10"><span class="section-number-3">1.10 </span>wait()</h3>
|
|||
|
<div class="outline-text-3" id="text-1-10">
|
|||
|
Souvent, le processus père a besoin de prendre connaissance de la terminaison
|
|||
|
des fils qu'il a créés, et d'en connaître le code ou la cause de fin. La primitive
|
|||
|
<methode>wait()</methode> (définie dans sys/wait.h) permet de réaliser
|
|||
|
cette opération.
|
|||
|
<p>
|
|||
|
<methode>pid_t wait(int *status)</methode> permet d'attendre (de façon bloquante) la terminaison
|
|||
|
d'un fils du processus appelant (terminé avec exit ou tué par un signal). Elle :
|
|||
|
</p><ul>
|
|||
|
<li> renvoie le pid du fils qui s'est arrêté ou a été arrêté
|
|||
|
</li>
|
|||
|
<p>
|
|||
|
</p><li> indique dans le paramètre status, passé par référence, le code de terminaison (exit)
|
|||
|
ou le numéro du signal ayant tué le fils. L'accès à ces informations est facilité par des macros :
|
|||
|
<ul>
|
|||
|
<li>
|
|||
|
WIFEXITED(status) est vrai si le fils s'est terminé avec exit
|
|||
|
</li>
|
|||
|
<li>WEXITSTATUS(status) renvoie la valeur du exit
|
|||
|
</li>
|
|||
|
<li>WIFSIGNALED(status) est vrai si le fils a été tué par un signal
|
|||
|
</li>
|
|||
|
<li>WTERMSIG(status) renvoie le numéro du signal ayant tué le fils
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p>Le code suivant reprend le code initial en y modifiant les points suivants :
|
|||
|
</p><ul>
|
|||
|
<li>les fils 1 et 3 terminent immédiatement sans attente
|
|||
|
</li>
|
|||
|
<li>le fils 2 s'en dort pendant une durée assez longue
|
|||
|
</li>
|
|||
|
<li>les 3 fils renvoient leur numéro (respectivement 1, 2, 3) comme valeur de fin
|
|||
|
</li>
|
|||
|
<li>le processus principal (père) attend la fin de ses 3 fils, et affiche pour chacun d'eux :
|
|||
|
<ul>
|
|||
|
<li>la cause de teminaison : avec exit, ou tué par un signal :
|
|||
|
</li>
|
|||
|
<li>la valuer du exit ou le numéro du signal
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<pre> 1 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Exemple d'illustration des primitives Unix : Un père et ses fils */</font>
|
|||
|
2 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* wait : le père attend la fin de ses fils */</font>
|
|||
|
3
|
|||
|
4 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdio.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* entrées sorties */</font>
|
|||
|
5 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>unistd.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pimitives de base : fork, ...*/</font>
|
|||
|
6 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdlib.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exit */</font>
|
|||
|
7 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>sys/wait.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* wait */</font>
|
|||
|
8
|
|||
|
9 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#define</font> NB_FILS 3 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* nombre de fils */</font>
|
|||
|
10
|
|||
|
11 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> main<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"></font>
|
|||
|
12 {
|
|||
|
13 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> fils, retour, wstatus, fils_termine <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
14 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> duree_sommeil <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 300<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
15
|
|||
|
16 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nJe suis le processus principal de pid %d\n"</font>, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
17 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Vidange du tampon de sortie pour que le fils le récupère vide */</font>
|
|||
|
18 fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
19
|
|||
|
20 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
21 retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> fork<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
22
|
|||
|
23 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Bonne pratique : tester systématiquement le retour des appels système */</font>
|
|||
|
24 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* échec du fork */
|
|||
|
</font>
|
|||
|
25 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Erreur fork\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
26 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Convention : s'arrêter avec une valeur <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> 0 en cas d'erreur */</font>
|
|||
|
27 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
28 }
|
|||
|
29
|
|||
|
30 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils */</font>
|
|||
|
31 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
32 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d, de pid %d, de pere %d.\n"</font>,
|
|||
|
33 fils, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, getppid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
34 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Le fils 2 s'endort pendant une durée asse longue */</font>
|
|||
|
35 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 2<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
36 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>duree_sommeil<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
37 }
|
|||
|
38 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* normalement exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, mais on veut illustrer WEXITSTATUS */</font>
|
|||
|
39 }
|
|||
|
40
|
|||
|
41 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pere */</font>
|
|||
|
42 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> {
|
|||
|
43 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus de pid %d a cree un fils numero %d, de pid %d \n"</font>,
|
|||
|
44 getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, fils, retour<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
45 }
|
|||
|
46 }
|
|||
|
47
|
|||
|
48 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>3<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pour les besoins de l'outil de validation automatique */</font>
|
|||
|
49
|
|||
|
50 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* attendre la fin des fils */</font>
|
|||
|
51 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
52 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* attendre la fin d'un fils */</font>
|
|||
|
53 fils_termine <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> wait<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>&wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
54
|
|||
|
55 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> WIFEXITED<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils terminé avec exit */
|
|||
|
</font>
|
|||
|
56 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nMon fils de pid %d a termine avec exit %d\n"</font>,
|
|||
|
57 fils_termine, WEXITSTATUS<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
58 }
|
|||
|
59 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> WIFSIGNALED<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils tué par un signal */</font>
|
|||
|
60 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nMon fils de pid %d a ete tue par le signal %d\n"</font>,
|
|||
|
61 fils_termine, WTERMSIG<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
62 }
|
|||
|
63 }
|
|||
|
64 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus Principal termine\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
65 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">return</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">EXIT_SUCCESS</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
66 }
|
|||
|
</pre>
|
|||
|
<p>Testez ce code dans l'outils "apisys" et répondez aux questions posées.
|
|||
|
</p></div>
|
|||
|
</div>
|
|||
|
|
|||
|
<div id="outline-container-1-11" class="outline-3">
|
|||
|
<h3 id="titre1-11"><span class="section-number-3">1.11 </span>execl()</h3>
|
|||
|
<div class="outline-text-3" id="text-1-11">
|
|||
|
Les primitives <methode>exec</methode> constituent une famille de primitives permettant
|
|||
|
le lancement de l’exécution d’un nouveau programme par le processus appelant.
|
|||
|
Cela n’entraîne pas la création d’un nouveau processus mais seulement le chargement et
|
|||
|
le lancement d’un nouveau programme exécutable, en lieu et place du programme effectuant
|
|||
|
l’appel à la primitive <methode>exec</methode>.
|
|||
|
<p>On parle de recouvrement :
|
|||
|
le nouveau programme recouvre (remplace complètement) le processus appelant.
|
|||
|
</p><p>
|
|||
|
<methode>int execl(char *ref, char *arg0, char *arg1,..., char *argn, NULL)</methode>
|
|||
|
</p><p>
|
|||
|
</p><p>
|
|||
|
<methode>int execlp(char *ref, char *arg0, char *arg1,..., char *argn, NULL)</methode>
|
|||
|
</p><p>
|
|||
|
permettent le lancement de l’exécution du fichier exécutable dont :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
le nom est indiqué par le premier paramètre "ref"
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
la liste des arguments fournie dans "arg0", "arg1",…,"argn"
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p>execlp effectue une recherche de l'exécutable dans tous les répertoires de PATH.
|
|||
|
</p><p>
|
|||
|
<methode>ref</methode> doit référencer un fichier qui existe et qui est exécutable.
|
|||
|
Le paramètre "arg0" est obligatoire et pointe en général sur une chaîne
|
|||
|
identique à celle pointée par "ref".
|
|||
|
</p><p>
|
|||
|
Le comportement de la primitive <methode>execl</methode> est le suivant :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
si l'exécutable référencé par <methode>ref</methode> existe, il sera chargé et lancé en
|
|||
|
en lieu et place du processus courant, sans aucun retour dans ce dernier.
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
sinon, on continue à exécuter le code du processus appelant, et dans ce cas il faut traiter
|
|||
|
l'erreur.
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p>
|
|||
|
On reprend l'exempe initial, et on :
|
|||
|
</p><ul>
|
|||
|
<li>
|
|||
|
remplace dans les fils, l'appel à "sleep()" par l'exécution
|
|||
|
du programme "dormir" qui fait la même chose.
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
introduit une petite erreur dans le nom de l'exécutable pour le fils 2
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
ajoute dans le père une boucle d'attente de la terminaison des 3 fils,
|
|||
|
en affichant pour chacun le mode d'arrêt et la valeur correspondante
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
Ce qui donne le code ci-dessous.
|
|||
|
<p>
|
|||
|
</p><pre> 1 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Exemple d'illustration des primitives Unix : Un père et ses fils */</font>
|
|||
|
2 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* execl */</font>
|
|||
|
3
|
|||
|
4 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdio.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* entrées sorties */</font>
|
|||
|
5 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>unistd.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pimitives de base : fork, ...*/</font>
|
|||
|
6 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdlib.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exit */</font>
|
|||
|
7 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>sys/wait.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* wait */</font>
|
|||
|
8
|
|||
|
9 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#define</font> NB_FILS 3 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* nombre de fils */</font>
|
|||
|
10
|
|||
|
11 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> main<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>
|
|||
|
12 {
|
|||
|
13 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> fils, retour, wstatus, fils_termine <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
14
|
|||
|
15 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">char</font> ref_exec[]<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"./dormir"</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exécutable */</font>
|
|||
|
16 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">char</font> arg0_exec[]<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"je dors"</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* argument0 du exec : nom donnée au processus */</font>
|
|||
|
17 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">char</font> arg1_exec[]<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"3"</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* argument0 du exec : durée de sommeil */</font>
|
|||
|
18
|
|||
|
19 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Je suis le processus principal de pid %d\n"</font>, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
20 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Vidange du tampon de sortie pour que le fils le récupère vide */</font>
|
|||
|
21 fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
22
|
|||
|
23 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
24 retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> fork<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
25
|
|||
|
26 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Bonne pratique : tester systématiquement le retour des appels système */</font>
|
|||
|
27 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* échec du fork */</font>
|
|||
|
28 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Erreur fork\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
29 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Convention : s'arrêter avec une valeur <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> 0 en cas d'erreur */</font>
|
|||
|
30 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
31 }
|
|||
|
32
|
|||
|
33 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils */</font>
|
|||
|
34 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
35
|
|||
|
36 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* mettre un executable inexistant pour le fils 2 */</font>
|
|||
|
37 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 2<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
38 ref_exec[3] <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 'a' <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
39 }
|
|||
|
40
|
|||
|
41 execl<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>ref_exec, arg0_exec, arg1_exec, NULL<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
42
|
|||
|
43 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* on ne se retrouve ici que si exec échoue */</font>
|
|||
|
44 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d : ERREUR EXEC\n"</font>, fils<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
45 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* perror : affiche un message relatif à l'erreur du dernier appel systàme */</font>
|
|||
|
46 perror<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">" exec "</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
47 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* sortie avec le numéro di fils qui a échoué */ </font>
|
|||
|
48 }
|
|||
|
49 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pere */</font>
|
|||
|
50 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> {
|
|||
|
51 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus de pid %d a cree un fils numero %d, de pid %d \n"</font>,
|
|||
|
52 getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, fils, retour<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
53 fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
54 }
|
|||
|
55 }
|
|||
|
56 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>3<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pour les besoins de l'outil de validation automatique */</font>
|
|||
|
57
|
|||
|
58 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* attendre la fin des fils */</font>
|
|||
|
59 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
60 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* attendre la fin d'un fils */</font>
|
|||
|
61 fils_termine <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> wait<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>&wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
62
|
|||
|
63 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> WIFEXITED<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils terminé avec exit */</font>
|
|||
|
64 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nMon fils de pid %d a termine avec exit %d\n"</font>,
|
|||
|
65 fils_termine, WEXITSTATUS<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
66 }
|
|||
|
67 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> WIFSIGNALED<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils tué par un signal */</font>
|
|||
|
68 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nMon fils de pid %d a ete tue par le signal %d\n"</font>,
|
|||
|
69 fils_termine, WTERMSIG<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
70 }
|
|||
|
71 }
|
|||
|
72 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus Principal termine\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
73 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">return</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">EXIT_SUCCESS</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
74 }
|
|||
|
</pre>
|
|||
|
|
|||
|
<p>
|
|||
|
Testez ce code dans l'outil "apisys" (comme indiqué plus haut), et répondez aux questions posées.
|
|||
|
</p><h4 class="trigger"> <a href="#">Visualiser l'interprétation des résultats</a></h4>
|
|||
|
<section class="toggle_container" style="display: none;">
|
|||
|
<p> En l'exécutant, on remarquera que pour les fils 1 et 3, les appels execl fonctionnent bien et
|
|||
|
qu'il n'y a pas de retour après le exec :
|
|||
|
</p><ul>
|
|||
|
<li>pas d'exécution du printf("\n Processus fils numero %d : ERREUR EXEC\n", fils);
|
|||
|
</li>
|
|||
|
<li>pas d'exécution exit(fils) car la valeur de terminaison reçue pr le père est 0
|
|||
|
(celle de dormir)
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
Mais, pour le fils 2, le nom de l'exécutable n'était pas correct et le execl échoue.
|
|||
|
Ce qui conduit au retour dans le code appelant le execl, et affichage des messages d'erreur.
|
|||
|
</section>
|
|||
|
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<div id="outline-container-1-12" class="outline-3">
|
|||
|
<h3 id="titre1-12"><span class="section-number-3">1.12 </span>execv()</h3>
|
|||
|
<div class="outline-text-3" id="text-1-12">
|
|||
|
|
|||
|
<p>
|
|||
|
<methode>int execv(char *ref, char *argv[])</methode>
|
|||
|
</p><p>
|
|||
|
permet le lancement de l’exécution du fichier exécutable dont le nom est "ref",
|
|||
|
avec comme arguments les chaînes pointées par argv[0],
|
|||
|
</p><p>argv[1],...,argv[n]. argv[n+1] doit être contenir "NULL".
|
|||
|
</p><p>Le code suivant reprend le code précédent en remplaçant l'appel à
|
|||
|
execl par execv, et en utilisant un tableau de pointeurs sur les
|
|||
|
arguments du exec.
|
|||
|
</p><p>Contrairement au code précédent, on uilise ici la même référence pour
|
|||
|
les paramètres "ref" et argv[0](ce qui est souvent le cas).
|
|||
|
</p><pre> 1 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Exemple d'illustration des primitives Unix : Un père et ses fils */</font>
|
|||
|
2 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* execv */</font>
|
|||
|
3
|
|||
|
4 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdio.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* entrées sorties */</font>
|
|||
|
5 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>unistd.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pimitives de base : fork, ...*/</font>
|
|||
|
6 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdlib.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exit */</font>
|
|||
|
7 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>sys/wait.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* wait */</font>
|
|||
|
8 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>string.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* opérations sur les chaines */</font>
|
|||
|
9
|
|||
|
10 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#define</font> NB_FILS 3 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* nombre de fils */</font>
|
|||
|
11
|
|||
|
12 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> main<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>
|
|||
|
13 {
|
|||
|
14 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> fils, retour, wstatus, fils_termine <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
15
|
|||
|
16 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">char</font> *argv[8] <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* tableau de pointeurs sur les arguments du exec */</font>
|
|||
|
17 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">char</font> args_exec[8][16] <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* tableau des arguments du exec */</font>
|
|||
|
18 strcpy<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>args_exec[0], <font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"./dormir"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* arg0 */</font>
|
|||
|
19 argv[0] <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> args_exec[0] <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* ponteur sur arg0 */</font>
|
|||
|
20 strcpy<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>args_exec[1], <font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"3"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* arg1 : durée de sommeil */</font>
|
|||
|
21 argv[1] <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> args_exec[1] <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* ponteur sur arg1 */</font>
|
|||
|
22 argv[2] <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> NULL <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* dernier pointeur <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> NULL */</font>
|
|||
|
23
|
|||
|
24 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Je suis le processus principal de pid %d\n"</font>, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
25 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Vidange du tampon de sortie pour que le fils le récupère vide */</font>
|
|||
|
26 fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
27
|
|||
|
28 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
29 retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> fork<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
30
|
|||
|
31 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Bonne pratique : tester systématiquement le retour des appels système */</font>
|
|||
|
32 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* échec du fork */</font>
|
|||
|
33 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Erreur fork\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
34 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Convention : s'arrêter avec une valeur <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> 0 en cas d'erreur */</font>
|
|||
|
35 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
36 }
|
|||
|
37
|
|||
|
38 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils */</font>
|
|||
|
39 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
40
|
|||
|
41 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* mettre un executable inexistant pour le fils 2 */</font>
|
|||
|
42 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 2<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
43 args_exec[0][3] <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 'a' <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
44 }
|
|||
|
45
|
|||
|
46 execv<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>argv[0], argv<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* argv[0] utilisé comme nom de l'exécutable */</font>
|
|||
|
47
|
|||
|
48 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* on ne se retrouve ici que si exec échoue */</font>
|
|||
|
49 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d : ERREUR EXEC\n"</font>, fils<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
50 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* perror : affiche un message relatif à l'erreur du dernier appel systàme */</font>
|
|||
|
51 perror<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">" exec "</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
52 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* sortie avec le numéro di fils qui a échoué */ </font>
|
|||
|
53 }
|
|||
|
54 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pere */</font>
|
|||
|
55 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> {
|
|||
|
56 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus de pid %d a cree un fils numero %d, de pid %d \n"</font>,
|
|||
|
57 getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, fils, retour<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
58 fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
59 }
|
|||
|
60 }
|
|||
|
61 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>3<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pour les besoins de l'outil de validation automatique */</font>
|
|||
|
62
|
|||
|
63 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* attendre la fin des fils */</font>
|
|||
|
64 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
65 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* attendre la fin d'un fils */</font>
|
|||
|
66 fils_termine <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> wait<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>&wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
67
|
|||
|
68 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> WIFEXITED<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils terminé avec exit */</font>
|
|||
|
69 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nMon fils de pid %d a termine avec exit %d\n"</font>,
|
|||
|
70 fils_termine, WEXITSTATUS<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
71 }
|
|||
|
72 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> WIFSIGNALED<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils tué par un signal */</font>
|
|||
|
73 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nMon fils de pid %d a ete tue par le signal %d\n"</font>,
|
|||
|
74 fils_termine, WTERMSIG<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
75 }
|
|||
|
76 }
|
|||
|
77 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus Principal termine\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
78 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">return</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">EXIT_SUCCESS</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
79 }
|
|||
|
</pre>
|
|||
|
<p>
|
|||
|
Dans les deux versions précédentes, le fichier exécutable est trouvé grâce à son chemin
|
|||
|
complet (./dormir).
|
|||
|
</p><p>
|
|||
|
<methode>execlp</methode> et <methode>execvp</methode> sont deux variantes de respectivement execl et execv, mais avec
|
|||
|
recherche du fichier exécutable dans la liste des répertoires contenue dans la variable PATH.
|
|||
|
</p></div>
|
|||
|
</div>
|
|||
|
<div id="outline-container-1-13" class="outline-3">
|
|||
|
<h3 id="titre1-13"><span class="section-number-3">1.13 </span>Conservation des descripteurs</h3>
|
|||
|
<div class="outline-text-3" id="text-1-13">
|
|||
|
Les descripteurs ouverts avant l'appel à une primitive <methode>exec</methode>
|
|||
|
le restent, et sont donc accessibles par l'exécutable lancé avec <methode>exec</methode>.
|
|||
|
<p>
|
|||
|
On peut illustrer cela en exécutant l'avant dernier programme en redirigeant
|
|||
|
la sortie standard dans un fichier.
|
|||
|
</p><p>
|
|||
|
Mais l'appel à execl écrase le tampon de sortie ; ce qui induit un
|
|||
|
risque de perte d’information. Par exemple, si on introduit, dans le
|
|||
|
fils, l'affichage d'un message avant l'appel à execl, ce message risque
|
|||
|
de ne pas s'afficher s'il ne se
|
|||
|
termine pas avec '\n' ou si l'exécution se fait avec redirection.
|
|||
|
</p><p>
|
|||
|
Pour forcer le vidage de ce tampon avant l’appel à execl on utilise la fonction fflush() de la bibliothèque standard stdio.h.
|
|||
|
</p><p>
|
|||
|
Ce qui donne le code suivant :
|
|||
|
</p><p>
|
|||
|
</p><pre> 1 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Exemple d'illustration des primitives Unix : Un père et ses fils */</font>
|
|||
|
2 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* execl et fflush */</font>
|
|||
|
3
|
|||
|
4 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdio.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* entrées sorties */</font>
|
|||
|
5 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>unistd.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pimitives de base : fork, ...*/</font>
|
|||
|
6 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>stdlib.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exit */</font>
|
|||
|
7 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#include</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font>sys/wait.h<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* wait */</font>
|
|||
|
8
|
|||
|
9 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">#define</font> NB_FILS 3 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* nombre de fils */</font>
|
|||
|
10
|
|||
|
11 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> main<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>
|
|||
|
12 {
|
|||
|
13 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">int</font> fils, retour, wstatus, fils_termine <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
14
|
|||
|
15 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">char</font> ref_exec[]<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"./dormir"</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* exécutable */</font>
|
|||
|
16 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">char</font> arg0_exec[]<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"je dors"</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* argument0 du exec : nom donnée au processus */</font>
|
|||
|
17 <font style="--darkreader-inline-color:#ff72ff;" data-darkreader-inline-color="" color="purple">char</font> arg1_exec[]<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"3"</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* argument0 du exec : durée de sommeil */</font>
|
|||
|
18
|
|||
|
19 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Je suis le processus principal de pid %d\n"</font>, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
20 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Vidange du tampon de sortie pour que le fils le récupère vide */</font>
|
|||
|
21 fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
22
|
|||
|
23 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
24 retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> fork<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
25
|
|||
|
26 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Bonne pratique : tester systématiquement le retour des appels système */</font>
|
|||
|
27 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* échec du fork */</font>
|
|||
|
28 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"Erreur fork\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
29 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Convention : s'arrêter avec une valeur <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">></font> 0 en cas d'erreur */</font>
|
|||
|
30 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>1<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
31 }
|
|||
|
32
|
|||
|
33 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils */</font>
|
|||
|
34 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>retour <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 0<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
35 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d, de pid %d, de pere %d.\n"</font>,
|
|||
|
36 fils, getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, getppid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
37
|
|||
|
38 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Précaution en cas d'une exécution avec redirection : */</font>
|
|||
|
39 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* Vidange du tampon de sortie avant qu'il ne soit écrasé par exec */</font>
|
|||
|
40 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* D'après le standard ISO le comportement du printf présente 2 cas : */</font>
|
|||
|
41 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* - sortie interactive <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>terminal<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> : flot géré par ligne et \n provoque */</font>
|
|||
|
42 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* la vidange du tampon langage */</font>
|
|||
|
43 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* - sortie dans un fichier : flot géré par bloc et \n est traité comme */</font>
|
|||
|
44 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* un caractère ordinaire. fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> force la vidange du tampon. */</font>
|
|||
|
45 fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
46
|
|||
|
47 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* executable inexistant pour le fils 2 */</font>
|
|||
|
48 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">==</font> 2<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
49 ref_exec[3] <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 'a' <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
50 }
|
|||
|
51
|
|||
|
52 execl<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>ref_exec, arg0_exec, arg1_exec, NULL<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
53
|
|||
|
54 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* on ne se retrouve ici que si exec échoue */</font>
|
|||
|
55 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\n Processus fils numero %d : ERREUR EXEC\n"</font>, fils<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
56 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* perror : affiche un message relatif à l'erreur du dernier appel systàme */</font>
|
|||
|
57 perror<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">" exec "</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
58 exit<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* sortie avec le numéro di fils qui a échoué */ </font>
|
|||
|
59 }
|
|||
|
60 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pere */</font>
|
|||
|
61 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> {
|
|||
|
62 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus de pid %d a cree un fils numero %d, de pid %d \n"</font>,
|
|||
|
63 getpid<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font>, fils, retour<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
64 fflush<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>stdout<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
65 }
|
|||
|
66 }
|
|||
|
67 sleep<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>3<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* pour les besoins de l'outil de validation automatique */</font>
|
|||
|
68
|
|||
|
69 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* attendre la fin des fils */</font>
|
|||
|
70 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">for</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> 1 <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red"><=</font> NB_FILS <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font> fils++<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> {
|
|||
|
71 <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* attendre la fin d'un fils */</font>
|
|||
|
72 fils_termine <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">=</font> wait<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>&wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
73
|
|||
|
74 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> WIFEXITED<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils terminé avec exit */</font>
|
|||
|
75 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nMon fils de pid %d a termine avec exit %d\n"</font>,
|
|||
|
76 fils_termine, WEXITSTATUS<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
77 }
|
|||
|
78 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">else</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">if</font> WIFSIGNALED<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> { <font style="--darkreader-inline-color:#72ff72;" data-darkreader-inline-color="" color="green">/* fils tué par un signal */</font>
|
|||
|
79 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nMon fils de pid %d a ete tue par le signal %d\n"</font>,
|
|||
|
80 fils_termine, WTERMSIG<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font>wstatus<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
81 }
|
|||
|
82 }
|
|||
|
83 printf<font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">(</font><font style="--darkreader-inline-color:#ffae1a;" data-darkreader-inline-color="" color="orange">"\nProcessus Principal termine\n"</font><font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">)</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
84 <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">return</font> <font style="--darkreader-inline-color:#337dff;" data-darkreader-inline-color="" color="blue">EXIT_SUCCESS</font> <font style="--darkreader-inline-color:#ff1a1a;" data-darkreader-inline-color="" color="red">;</font>
|
|||
|
85 }
|
|||
|
</pre>
|
|||
|
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
</body></html>
|