f
This commit is contained in:
commit
041f660ccd
346 changed files with 26975 additions and 0 deletions
929
CSCI 4061_ Exam 2 Review Problems.html
Normal file
929
CSCI 4061_ Exam 2 Review Problems.html
Normal file
|
@ -0,0 +1,929 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<!-- saved from url=(0072)http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html -->
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<title>CSCI 4061: Exam 2 Review Problems</title>
|
||||||
|
<!-- 2017-11-18 Sat 11:21 -->
|
||||||
|
|
||||||
|
<meta name="generator" content="Org-mode">
|
||||||
|
<meta name="author" content="Chris Kauffman">
|
||||||
|
<style type="text/css">
|
||||||
|
<!--/*--><![CDATA[/*><!--*/
|
||||||
|
.title { text-align: center; }
|
||||||
|
.todo { font-family: monospace; color: red; }
|
||||||
|
.done { color: green; }
|
||||||
|
.tag { background-color: #eee; font-family: monospace;
|
||||||
|
padding: 2px; font-size: 80%; font-weight: normal; }
|
||||||
|
.timestamp { color: #bebebe; }
|
||||||
|
.timestamp-kwd { color: #5f9ea0; }
|
||||||
|
.right { margin-left: auto; margin-right: 0px; text-align: right; }
|
||||||
|
.left { margin-left: 0px; margin-right: auto; text-align: left; }
|
||||||
|
.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: 8pt;
|
||||||
|
font-family: monospace;
|
||||||
|
overflow: auto;
|
||||||
|
margin: 1.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: 3px;
|
||||||
|
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.right { text-align: center; }
|
||||||
|
th.left { text-align: center; }
|
||||||
|
th.center { text-align: center; }
|
||||||
|
td.right { text-align: right; }
|
||||||
|
td.left { text-align: left; }
|
||||||
|
td.center { text-align: center; }
|
||||||
|
dt { font-weight: bold; }
|
||||||
|
.footpara:nth-child(2) { display: inline; }
|
||||||
|
.footpara { display: block; }
|
||||||
|
.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>
|
||||||
|
<meta name="viewport" content="width=device-width, maximum-scale=1, minimum-scale=1">
|
||||||
|
<style type="text/css">
|
||||||
|
@media screen {
|
||||||
|
:root {
|
||||||
|
--heading-bg-color:#e8c62e;
|
||||||
|
--heading-fg-color:#7a0019;
|
||||||
|
}
|
||||||
|
html {
|
||||||
|
font-family: serif;
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
|
pre.src, pre.example {
|
||||||
|
overflow-x: scroll;
|
||||||
|
}
|
||||||
|
/* Merge subtitle area with title area */
|
||||||
|
.subtitle {
|
||||||
|
text-align: center;
|
||||||
|
margin-top: -2em;
|
||||||
|
padding-top: 1em;
|
||||||
|
padding-bottom: 0.1em;
|
||||||
|
}
|
||||||
|
.title, .subtitle {
|
||||||
|
color: var(--heading-fg-color);
|
||||||
|
background-color: var(--heading-bg-color);
|
||||||
|
}
|
||||||
|
/* Section borders, left section header style */
|
||||||
|
div.outline-2, #table-of-contents {
|
||||||
|
background-color: rgb(250,250,250);
|
||||||
|
border: 0.75em solid var(--heading-bg-color);
|
||||||
|
border-top: 0em;
|
||||||
|
padding: 0em .5em .5em .5em; /* top right bottom left */
|
||||||
|
margin: 1em 0em 1em 0em; /* top right bottom left */
|
||||||
|
}
|
||||||
|
div.outline-2 > h2, #table-of-contents > h2 {
|
||||||
|
background-color: var(--heading-bg-color);
|
||||||
|
color: var(--heading-fg-color);
|
||||||
|
font-variant: small-caps;
|
||||||
|
padding: 0em 0em 0em .5em; /* top right bottom left */
|
||||||
|
margin: 0em -.5em 0em -.75em; /* top right bottom left */
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
blockquote {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
td, th {
|
||||||
|
padding-top: 2px;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
background-color: #EEE;
|
||||||
|
}
|
||||||
|
pre {
|
||||||
|
}
|
||||||
|
#content, #preamble, #postamble {
|
||||||
|
margin-left:300px;
|
||||||
|
}
|
||||||
|
.tag {
|
||||||
|
background-color: inherit; font-family: inherit;
|
||||||
|
padding: inherit; font-size: 80%; font-weight: inherit;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
.figure p { text-align: inherit; }
|
||||||
|
figure-number { font-style: italic; }
|
||||||
|
#table-of-contents {
|
||||||
|
text-align: left;
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0;
|
||||||
|
width: 300px;
|
||||||
|
top: 0;
|
||||||
|
height: 100%;
|
||||||
|
border: 0;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
#text-table-of-contents {
|
||||||
|
overflow-y: scroll;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
#text-table-of-contents ul {
|
||||||
|
padding-left: 1em;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
}
|
||||||
|
#table-of-contents > h2 {
|
||||||
|
padding: 0.1em;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
/* adjustments for small screen, toc at top only */
|
||||||
|
@media (max-width: 800px) { /* landscape for iphone */
|
||||||
|
html {
|
||||||
|
-webkit-text-size-adjust: none; /* prevent scaling of text on mobile */
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
background-color: #EEE;
|
||||||
|
width:100%;
|
||||||
|
margin:0 auto;
|
||||||
|
}
|
||||||
|
#content, #preamble, #postamble {
|
||||||
|
margin-left:0;
|
||||||
|
}
|
||||||
|
#table-of-contents {
|
||||||
|
position: static;
|
||||||
|
left: inherit;
|
||||||
|
width:inherit;
|
||||||
|
height: auto;
|
||||||
|
border-top: 0em;
|
||||||
|
padding: 0em .5em .5em .5em; /* top right bottom left */
|
||||||
|
margin: 1em 0em 1em 0em; /* top right bottom left */
|
||||||
|
border: 0.75em solid #006633;
|
||||||
|
}
|
||||||
|
div.outline-2, #table-of-contents {
|
||||||
|
background-color: rgb(250,250,250);
|
||||||
|
border: 0.75em solid var(--heading-bg-color);
|
||||||
|
border-top: 0em;
|
||||||
|
padding: 0em .5em .5em .5em; /* top right bottom left */
|
||||||
|
margin: 1em 0em 1em 0em; /* top right bottom left */
|
||||||
|
}
|
||||||
|
div.outline-2 > h2, #table-of-contents > h2 {
|
||||||
|
background-color: var(--heading-bg-color);
|
||||||
|
color: var(--heading-fg-color);
|
||||||
|
font-variant: small-caps;
|
||||||
|
padding: 0em 0em 0em .5em; /* top right bottom left */
|
||||||
|
margin: 0em -.5em 0em -.75em; /* top right bottom left */
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
#text-table-of-contents {
|
||||||
|
overflow-y: visible;
|
||||||
|
height: inherit;
|
||||||
|
}
|
||||||
|
#text-table-of-contents ul {
|
||||||
|
padding-left: 1em;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.linenr { font-size: xx-small; }
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
html {
|
||||||
|
font-family: serif;
|
||||||
|
font-size: 10pt;
|
||||||
|
text-align: justify;
|
||||||
|
.linenr { font-size: xx-small; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script type="text/javascript">
|
||||||
|
/*
|
||||||
|
@licstart The following is the entire license notice for the
|
||||||
|
JavaScript code in this tag.
|
||||||
|
|
||||||
|
Copyright (C) 2012-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
The JavaScript code in this tag is free software: you can
|
||||||
|
redistribute it and/or modify it under the terms of the GNU
|
||||||
|
General Public License (GNU GPL) as published by the Free Software
|
||||||
|
Foundation, either version 3 of the License, or (at your option)
|
||||||
|
any later version. The code is distributed WITHOUT ANY WARRANTY;
|
||||||
|
without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
|
||||||
|
|
||||||
|
As additional permission under GNU GPL version 3 section 7, you
|
||||||
|
may distribute non-source (e.g., minimized or compacted) forms of
|
||||||
|
that code without the copy of the GNU GPL normally required by
|
||||||
|
section 4, provided you include this license notice and a URL
|
||||||
|
through which recipients can access the Corresponding Source.
|
||||||
|
|
||||||
|
|
||||||
|
@licend The above is the entire license notice
|
||||||
|
for the JavaScript code in this tag.
|
||||||
|
*/
|
||||||
|
<!--/*--><![CDATA[/*><!--*/
|
||||||
|
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>
|
||||||
|
<style>#cVim-command-bar, #cVim-command-bar-mode, #cVim-command-bar-input, #cVim-command-bar-search-results,
|
||||||
|
.cVim-completion-item, .cVim-completion-item .cVim-full, .cVim-completion-item .cVim-left,
|
||||||
|
.cVim-completion-item .cVim-right {
|
||||||
|
font-family: Helvetica, Helvetica Neue, Neue, sans-serif, monospace, Arial;
|
||||||
|
font-size: 10pt !important;
|
||||||
|
-webkit-font-smoothing: antialiased !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-command-bar {
|
||||||
|
position: fixed;
|
||||||
|
z-index: 2147483646;
|
||||||
|
background-color: #1b1d1e;
|
||||||
|
color: #bbb;
|
||||||
|
display: none;
|
||||||
|
box-sizing: content-box;
|
||||||
|
box-shadow: 0 3px 3px rgba(0,0,0,0.4);
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-command-bar-mode {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding-left: 2px;
|
||||||
|
height: 100%;
|
||||||
|
width: 10px;
|
||||||
|
padding-top: 2px;
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-command-bar-input {
|
||||||
|
background-color: #1b1d1e;
|
||||||
|
color: #bbb;
|
||||||
|
height: 100%;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
width: calc(100% - 10px);
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-command-bar-search-results {
|
||||||
|
position: fixed;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
z-index: 2147483647;
|
||||||
|
left: 0;
|
||||||
|
box-shadow: 0 3px 3px rgba(0,0,0,0.4);
|
||||||
|
background-color: #1c1c1c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item, .cVim-completion-item .cVim-full, .cVim-completion-item .cVim-left, .cVim-completion-item .cVim-right {
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
padding: 1px;
|
||||||
|
display: inline-block;
|
||||||
|
box-sizing: border-box;
|
||||||
|
vertical-align: middle;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item:nth-child(even) {
|
||||||
|
background-color: #1f1f1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item {
|
||||||
|
width: 100%; left: 0;
|
||||||
|
color: #bcbcbc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item[active] {
|
||||||
|
width: 100%; left: 0;
|
||||||
|
color: #1b1d1e;
|
||||||
|
background-color: #f1f1f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item[active] span {
|
||||||
|
color: #1b1d1e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item .cVim-left {
|
||||||
|
color: #fff;
|
||||||
|
width: 37%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item .cVim-right {
|
||||||
|
font-style: italic;
|
||||||
|
color: #888;
|
||||||
|
width: 57%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#cVim-link-container, .cVim-link-hint,
|
||||||
|
#cVim-hud, #cVim-status-bar {
|
||||||
|
font-family: Helvetica, Helvetica Neue, Neue, sans-serif, monospace, Arial;
|
||||||
|
font-size: 10pt !important;
|
||||||
|
-webkit-font-smoothing: antialiased !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-link-container {
|
||||||
|
position: absolute;
|
||||||
|
pointer-events: none;
|
||||||
|
width: 100%; left: 0;
|
||||||
|
height: 100%; top: 0;
|
||||||
|
z-index: 2147483647;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-link-hint {
|
||||||
|
position: absolute;
|
||||||
|
color: #302505 !important;
|
||||||
|
background-color: #ffd76e !important;
|
||||||
|
border-radius: 2px !important;
|
||||||
|
padding: 2px !important;
|
||||||
|
font-size: 8pt !important;
|
||||||
|
font-weight: 500 !important;
|
||||||
|
text-transform: uppercase !important;
|
||||||
|
border: 1px solid #ad810c;
|
||||||
|
display: inline-block !important;
|
||||||
|
vertical-align: middle !important;
|
||||||
|
text-align: center !important;
|
||||||
|
box-shadow: 2px 2px 1px rgba(0,0,0,0.25) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-link-hint_match {
|
||||||
|
color: #777;
|
||||||
|
text-transform: uppercase !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#cVim-hud {
|
||||||
|
background-color: rgba(28,28,28,0.9);
|
||||||
|
position: fixed !important;
|
||||||
|
transition: right 0.2s ease-out;
|
||||||
|
z-index: 24724289;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-hud span {
|
||||||
|
padding: 2px;
|
||||||
|
padding-left: 4px;
|
||||||
|
padding-right: 4px;
|
||||||
|
color: #8f8f8f;
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-frames-outline {
|
||||||
|
position: fixed;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 9999999999;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 3px solid yellow;
|
||||||
|
}
|
||||||
|
</style></head>
|
||||||
|
<body>
|
||||||
|
<div id="preamble" class="status">
|
||||||
|
<i>Last Updated: 2017-11-18 Sat 11:21</i>
|
||||||
|
</div>
|
||||||
|
<div id="content">
|
||||||
|
<h1 class="title">CSCI 4061: Exam 2 Review Problems</h1>
|
||||||
|
<div id="table-of-contents">
|
||||||
|
<h2>Table of Contents</h2>
|
||||||
|
<div id="text-table-of-contents">
|
||||||
|
<ul>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-1">1. Concurrent Printer</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-1-1">1.1. Printer Manager Process</a></li>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-1-2">1.2. Printer Cooperation</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-2">2. Graceful Shutdown</a></li>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-3">3. Critical Section</a></li>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-4">4. Concurrency and Signals</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-4-1">4.1. Code Outline</a></li>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-4-2">4.2. Implementation Flaws</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-5">5. Read vs Select</a></li>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-6">6. Busy Polling versus Interrupt Driven Mutex</a></li>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-7">7. Processes vs Threads</a>
|
||||||
|
<ul>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-7-1">7.1. Similarities and Differences</a></li>
|
||||||
|
<li><a href="http://www-users.cs.umn.edu/~kauffman/4061/12-exam2-review-problems.html#sec-7-2">7.2. Thread Pitfalls</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="outline-container-sec-1" class="outline-2">
|
||||||
|
<h2 id="sec-1"><span class="section-number-2">1</span> Concurrent Printer</h2>
|
||||||
|
<div class="outline-text-2" id="text-1">
|
||||||
|
</div><div id="outline-container-sec-1-1" class="outline-3">
|
||||||
|
<h3 id="sec-1-1"><span class="section-number-3">1.1</span> Printer Manager Process</h3>
|
||||||
|
<div class="outline-text-3" id="text-1-1">
|
||||||
|
<p>
|
||||||
|
A printer is a shared resource in that there is usually only one
|
||||||
|
attached to a computing system that many users/processes can access.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Consider managing the printer using a "daemon" (background
|
||||||
|
process). Programs that want to print do not so directly but instead
|
||||||
|
contact the daemon to request data be printed. The printer daemon
|
||||||
|
must get data from client processes, feed it to the printer, notify
|
||||||
|
the client process of the completion of the printing, and then
|
||||||
|
pick up the next request if any.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Describe a simple protocol that could accomplish this by specifying
|
||||||
|
the following:
|
||||||
|
</p>
|
||||||
|
<ul class="org-ul">
|
||||||
|
<li>What mechanism will you use to allow the printer daemon process to
|
||||||
|
communicate with a client?
|
||||||
|
</li>
|
||||||
|
<li>How will client processes communicate data to the daemon? Keep in
|
||||||
|
mind that print files have a variety of types and sizes
|
||||||
|
</li>
|
||||||
|
<li>How will the daemon process notify client processes of the
|
||||||
|
completion of the print job or errors that occurred?
|
||||||
|
</li>
|
||||||
|
<li>Keep in mind that the printer daemon is a system process started
|
||||||
|
when the computer boots.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-sec-1-2" class="outline-3">
|
||||||
|
<h3 id="sec-1-2"><span class="section-number-3">1.2</span> Printer Cooperation</h3>
|
||||||
|
<div class="outline-text-3" id="text-1-2">
|
||||||
|
<p>
|
||||||
|
As an alternative to the above daemon approach to managing a printer,
|
||||||
|
consider a protocol that DOES NOT involve a manager. In this setting,
|
||||||
|
the printer is usable directly by any process. However, processes that
|
||||||
|
print must obey a protocol you will design to avoid problems. The
|
||||||
|
printer is associated with a known special file /dev/printer. When
|
||||||
|
data is written to this file, it is sent directly to the
|
||||||
|
printer. However, if multiple processes write data simultaneously, the
|
||||||
|
printing results are likely to become corrupted.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Design a protocol that would allow the shared printer resource to be
|
||||||
|
managed without a manager process.
|
||||||
|
</p>
|
||||||
|
<ul class="org-ul">
|
||||||
|
<li>What mechanism would you use for processes want to print to
|
||||||
|
coordinate using the /dev/printer file?
|
||||||
|
</li>
|
||||||
|
<li>Is it possible in your scheme to guarantee fairness: processes that
|
||||||
|
are ready to print early actually get to print earlier than later
|
||||||
|
print attempts?
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="outline-container-sec-2" class="outline-2">
|
||||||
|
<h2 id="sec-2"><span class="section-number-2">2</span> Graceful Shutdown</h2>
|
||||||
|
<div class="outline-text-2" id="text-2">
|
||||||
|
<p>
|
||||||
|
Many system programs run for a long time accumulating data from files
|
||||||
|
that should be written out before shutting down. Occasionally these
|
||||||
|
"daemon" processes need to be closed down or restarted but should be
|
||||||
|
exited "gracefully" as in given an opportunity to write essential data
|
||||||
|
to files before exiting.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Describe a common mechanism in Unix to notify a program that it should
|
||||||
|
terminate but give it an opportunity to write essential data prior to
|
||||||
|
exiting. Describe the specific program control structures in the
|
||||||
|
program and system calls involved in such a graceful shutdown.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="outline-container-sec-3" class="outline-2">
|
||||||
|
<h2 id="sec-3"><span class="section-number-2">3</span> Critical Section</h2>
|
||||||
|
<div class="outline-text-2" id="text-3">
|
||||||
|
<p>
|
||||||
|
A database manger process is responsible for occasionally writing
|
||||||
|
database information in main memory to a file so that it is backed up
|
||||||
|
in the case of a crash. A system administrator can request an
|
||||||
|
immediate backup by sending the <code>SIGUSR1</code> signal to the manager
|
||||||
|
process. Backup requests are considered fairly low priority and can
|
||||||
|
be honored later.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The manager process is also responsible for handling certain
|
||||||
|
operations that are critical to integrity of the database and should
|
||||||
|
not be interrupted by backup requests.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Describe whether it is possible for the manager process to be written
|
||||||
|
to fulfill both of these requirements. Mention how it might be done
|
||||||
|
using Unix programming facilities.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-sec-4" class="outline-2">
|
||||||
|
<h2 id="sec-4"><span class="section-number-2">4</span> Concurrency and Signals</h2>
|
||||||
|
<div class="outline-text-2" id="text-4">
|
||||||
|
<p>
|
||||||
|
A simple protocol for communication between Process A and Process B
|
||||||
|
involves the following steps.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Process A
|
||||||
|
</p>
|
||||||
|
<ul class="org-ul">
|
||||||
|
<li>A1: Process A writes its PID to Pipe X
|
||||||
|
</li>
|
||||||
|
<li>A2: Process A sleeps waiting for a signal
|
||||||
|
</li>
|
||||||
|
<li>A3: Process A wakes up from a signal
|
||||||
|
</li>
|
||||||
|
<li>A4: Process A reads an integer from Pipe Y
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>B1: Process B reads a PID from Pipe X
|
||||||
|
</li>
|
||||||
|
<li>B2: Process B writes an integer to Pipe Y
|
||||||
|
</li>
|
||||||
|
<li>B3: Process B signals Process A to wake up and continue
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-sec-4-1" class="outline-3">
|
||||||
|
<h3 id="sec-4-1"><span class="section-number-3">4.1</span> Code Outline</h3>
|
||||||
|
<div class="outline-text-3" id="text-4-1">
|
||||||
|
<p>
|
||||||
|
Give an outline of C code for Process A and Process B which would
|
||||||
|
(roughly) implement the above protocol. Below
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
|
||||||
|
<pre class="src src-c">// PROCESS A
|
||||||
|
int pipeX[2];
|
||||||
|
int pipeY[2];
|
||||||
|
int receive; // put data "received" from Process B in this integer
|
||||||
|
|
||||||
|
// assume both pipes opened appropriately
|
||||||
|
|
||||||
|
// A1: Process A writes its PID to Pipe X
|
||||||
|
|
||||||
|
// A2: Process A sleeps waiting for a signal
|
||||||
|
|
||||||
|
// A3: Process A wakes up from a signal
|
||||||
|
|
||||||
|
// A4: Process A reads an integer from Pipe Y
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
|
||||||
|
<pre class="src src-c">// PROCESS B
|
||||||
|
int pipeX[2];
|
||||||
|
int pipeY[2];
|
||||||
|
int send = 42; // integer to "send" to Process A
|
||||||
|
|
||||||
|
// assume both pipes opened appropriately
|
||||||
|
|
||||||
|
// B1: Process B reads a PID from Pipe X
|
||||||
|
|
||||||
|
// B2: Process B writes an integer to Pipe Y
|
||||||
|
|
||||||
|
// B3: Process B signals Process A to wake up and continue
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="outline-container-sec-4-2" class="outline-3">
|
||||||
|
<h3 id="sec-4-2"><span class="section-number-3">4.2</span> Implementation Flaws</h3>
|
||||||
|
<div class="outline-text-3" id="text-4-2">
|
||||||
|
<p>
|
||||||
|
A naive implementation of the basic protocol outlined is likely to
|
||||||
|
contain flaws. For example, if Process A merely calls
|
||||||
|
</p>
|
||||||
|
<pre class="example">sleep(0);
|
||||||
|
</pre>
|
||||||
|
<p>
|
||||||
|
to await a signal, it may result in Process A never waking
|
||||||
|
up.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Describe a sequence of events using the steps <code>A1, A2,.. B1, B2</code> that
|
||||||
|
could give rise to the this situation. Also describe how one might fix
|
||||||
|
this with a slightly more complex sleeping/waiting behavior and
|
||||||
|
signals handling.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-sec-5" class="outline-2">
|
||||||
|
<h2 id="sec-5"><span class="section-number-2">5</span> Read vs Select</h2>
|
||||||
|
<div class="outline-text-2" id="text-5">
|
||||||
|
<p>
|
||||||
|
The code below appeared in a lab in files that compared only reading
|
||||||
|
from two separate files (pipes in this case) versus using the
|
||||||
|
<code>select()</code> system call. Describe the difference between these blocks.
|
||||||
|
</p>
|
||||||
|
<ul class="org-ul">
|
||||||
|
<li>What pattern of reading do you expect in each? Ex: Do you expect
|
||||||
|
fixed patterns like <code>ABAB..</code> or <code>ABBABB...</code> or arbitrary
|
||||||
|
intermingling like <code>ABBABAABBA...</code>?
|
||||||
|
</li>
|
||||||
|
<li>Which approach (<code>read()</code>-only or <code>select()/read()</code>) is appropriate
|
||||||
|
if input is coming at very different rates in pipeA versus pipeB?
|
||||||
|
Justify your answer.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
|
||||||
|
<pre class="src src-c">// file read_AB.c
|
||||||
|
while(!signaled){
|
||||||
|
char buf[1024];
|
||||||
|
int n;
|
||||||
|
|
||||||
|
n = read(pipeA[PREAD], buf, 1024);
|
||||||
|
buf[n] = '\0';
|
||||||
|
fprintf(stdout,"A had: |%s|\n",buf);
|
||||||
|
|
||||||
|
n = read(pipeB[PREAD], buf, 1024);
|
||||||
|
buf[n] = '\0';
|
||||||
|
fprintf(stdout,"B had: |%s|\n",buf);
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
<div class="org-src-container">
|
||||||
|
|
||||||
|
<pre class="src src-c">// file select_AB.c
|
||||||
|
while(!signaled){
|
||||||
|
fd_set read_set;
|
||||||
|
FD_ZERO(&read_set);
|
||||||
|
FD_SET(pipeA[PREAD], &read_set);
|
||||||
|
FD_SET(pipeB[PREAD], &read_set);
|
||||||
|
int maxfd = pipeA[PREAD];
|
||||||
|
maxfd = (maxfd < pipeB[PREAD]) ? pipeB[PREAD] : maxfd;
|
||||||
|
|
||||||
|
select(maxfd+1, &read_set, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
char buf[1024];
|
||||||
|
int n;
|
||||||
|
if(FD_ISSET(pipeA[PREAD], &read_set)){
|
||||||
|
n = read(pipeA[PREAD], buf, 1024);
|
||||||
|
buf[n] = '\0';
|
||||||
|
fprintf(stdout,"A had: |%s|\n",buf);
|
||||||
|
}
|
||||||
|
if(FD_ISSET(pipeB[PREAD], &read_set)){
|
||||||
|
n = read(pipeB[PREAD], buf, 1024);
|
||||||
|
buf[n] = '\0';
|
||||||
|
fprintf(stdout,"B had: |%s|\n",buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="outline-container-sec-6" class="outline-2">
|
||||||
|
<h2 id="sec-6"><span class="section-number-2">6</span> Busy Polling versus Interrupt Driven Mutex</h2>
|
||||||
|
<div class="outline-text-2" id="text-6">
|
||||||
|
<p>
|
||||||
|
Cee Lohacker is working on a drone with a small embedded processor and
|
||||||
|
Unix which provides POSIX threads and mutexes. Unfortunately, the
|
||||||
|
drone is manufactured in Easternopia and Cee cannot understand the
|
||||||
|
Easternopian dialect of the documentation. She needs know whether
|
||||||
|
mutexes on this system use
|
||||||
|
</p>
|
||||||
|
<ul class="org-ul">
|
||||||
|
<li>Busy polling to acquire a lock
|
||||||
|
</li>
|
||||||
|
<li>Interrupt driven waiting acquire a lock
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Writes the following short C program to test the mutexes and runs it
|
||||||
|
with the <code>time</code> command.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="org-src-container">
|
||||||
|
|
||||||
|
<pre class="src src-sh"><span class="linenr"> 1: </span>> cat mut_test.c
|
||||||
|
<span class="linenr"> 2: </span>#include <pthread.h>
|
||||||
|
<span class="linenr"> 3: </span>#include <stdio.h>
|
||||||
|
<span class="linenr"> 4: </span>#include <unistd.h>
|
||||||
|
<span class="linenr"> 5: </span>
|
||||||
|
<span class="linenr"> 6: </span>int glob = 1;
|
||||||
|
<span class="linenr"> 7: </span>pthread_mutex_t glob_lock;
|
||||||
|
<span class="linenr"> 8: </span>
|
||||||
|
<span class="linenr"> 9: </span>void *doit(void *param){
|
||||||
|
<span class="linenr">10: </span> pthread_mutex_lock(&glob_lock);
|
||||||
|
<span class="linenr">11: </span> glob = glob*2;
|
||||||
|
<span class="linenr">12: </span> sleep(2);
|
||||||
|
<span class="linenr">13: </span> pthread_mutex_unlock(&glob_lock);
|
||||||
|
<span class="linenr">14: </span> return NULL;
|
||||||
|
<span class="linenr">15: </span>}
|
||||||
|
<span class="linenr">16: </span>
|
||||||
|
<span class="linenr">17: </span>int main(){
|
||||||
|
<span class="linenr">18: </span> pthread_mutex_init(&glob_lock, NULL);
|
||||||
|
<span class="linenr">19: </span> printf("BEFORE glob: %d\n",glob);
|
||||||
|
<span class="linenr">20: </span> pthread_t threads[3];
|
||||||
|
<span class="linenr">21: </span> for(int i=0; i<3; i++){
|
||||||
|
<span class="linenr">22: </span> pthread_create(&threads[i], NULL, doit, NULL);
|
||||||
|
<span class="linenr">23: </span> }
|
||||||
|
<span class="linenr">24: </span> for(int i=0; i<3; i++){
|
||||||
|
<span class="linenr">25: </span> pthread_join(threads[i], (void **) NULL);
|
||||||
|
<span class="linenr">26: </span> }
|
||||||
|
<span class="linenr">27: </span> printf("AFTER glob: %d\n",glob);
|
||||||
|
<span class="linenr">28: </span> pthread_mutex_destroy(&glob_lock);
|
||||||
|
<span class="linenr">29: </span> return 0;
|
||||||
|
<span class="linenr">30: </span>}
|
||||||
|
<span class="linenr">31: </span>
|
||||||
|
<span class="linenr">32: </span>> gcc mut_test.c -lpthread
|
||||||
|
<span class="linenr">33: </span>
|
||||||
|
<span class="linenr">34: </span>> time a.out
|
||||||
|
<span class="linenr">35: </span>BEFORE glob: 1
|
||||||
|
<span class="linenr">36: </span>AFTER glob: ??? # glob final value
|
||||||
|
<span class="linenr">37: </span>
|
||||||
|
<span class="linenr">38: </span>real ??? # Wall time
|
||||||
|
<span class="linenr">39: </span>user ??? # User CPU time
|
||||||
|
<span class="linenr">40: </span>sys ???
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Answer the following questions
|
||||||
|
</p>
|
||||||
|
<ol class="org-ol">
|
||||||
|
<li>What is the expected value for <code>glob</code> after the code is run (marked
|
||||||
|
<code># glob final value</code>)?
|
||||||
|
</li>
|
||||||
|
<li>Assuming the mutexes use BUSY polling, what times are expected for
|
||||||
|
<ul class="org-ul">
|
||||||
|
<li>Real/Wall time?
|
||||||
|
</li>
|
||||||
|
<li>User CPU time?
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Explain your reasoning.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
<li>Assuming the mutexes use INTERRUPT-DRIVEN waiting, what times are
|
||||||
|
expected for
|
||||||
|
<ul class="org-ul">
|
||||||
|
<li>Real/Wall time?
|
||||||
|
</li>
|
||||||
|
<li>User CPU time?
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Explain your reasoning.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-sec-7" class="outline-2">
|
||||||
|
<h2 id="sec-7"><span class="section-number-2">7</span> Processes vs Threads</h2>
|
||||||
|
<div class="outline-text-2" id="text-7">
|
||||||
|
</div><div id="outline-container-sec-7-1" class="outline-3">
|
||||||
|
<h3 id="sec-7-1"><span class="section-number-3">7.1</span> Similarities and Differences</h3>
|
||||||
|
<div class="outline-text-3" id="text-7-1">
|
||||||
|
<p>
|
||||||
|
Outline the similarities and differences between Processes and
|
||||||
|
Threads. Describe some details of the assumptions that each makes
|
||||||
|
about what memory is shared versus private. Describe the tradeoffs
|
||||||
|
associated with using one versus the others on issues such as system
|
||||||
|
tools, security, and efficiency.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="outline-container-sec-7-2" class="outline-3">
|
||||||
|
<h3 id="sec-7-2"><span class="section-number-3">7.2</span> Thread Pitfalls</h3>
|
||||||
|
<div class="outline-text-3" id="text-7-2">
|
||||||
|
<p>
|
||||||
|
Recall the Pi calculation program discussed in class. One version of
|
||||||
|
this program spawned multiple threads to run the following worker
|
||||||
|
function.
|
||||||
|
</p>
|
||||||
|
<div class="org-src-container">
|
||||||
|
|
||||||
|
<pre class="src src-c">int total_hits = 0;
|
||||||
|
int points_per_thread = -1;
|
||||||
|
|
||||||
|
void *compute_pi(void *arg){
|
||||||
|
long thread_id = (long) arg;
|
||||||
|
unsigned int rstate = 123456789 * thread_id;
|
||||||
|
for (int i = 0; i < points_per_thread; i++) {
|
||||||
|
double x = ((double) rand_r(&rstate)) / ((double) RAND_MAX);
|
||||||
|
double y = ((double) rand_r(&rstate)) / ((double) RAND_MAX);
|
||||||
|
if (x*x + y*y <= 1.0){
|
||||||
|
total_hits++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
<ol class="org-ol">
|
||||||
|
<li>Why was it necessary to use the <code>rand_r()</code> function rather than the
|
||||||
|
standard <code>rand()</code> function to generate random numbers?
|
||||||
|
</li>
|
||||||
|
<li>Do all the worker threads generate identical random sequences of
|
||||||
|
numbers or are they different? Explain your reasoning.
|
||||||
|
</li>
|
||||||
|
<li>It was determined in discussion that this version <b>always</b>
|
||||||
|
underestimates the value of Pi. Explain why and how one might fix
|
||||||
|
this while also maintaining the efficiency of using multiple
|
||||||
|
threads to get speedup.
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="postamble" class="status">
|
||||||
|
<hr> <i> Author: Chris Kauffman (<a href="mailto:kauffman@phaedrus">kauffman@phaedrus</a>) <br> Date: 2017-11-18 Sat 11:21 <br> </i>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</body><div id="cVim-status-bar" style="top: 0px;"></div><iframe src="./CSCI 4061_ Exam 2 Review Problems_files/cmdline_frame.html" id="cVim-command-frame"></iframe></html>
|
186
CSCI 4061_ Exam 2 Review Problems_files/cmdline_frame.html
Normal file
186
CSCI 4061_ Exam 2 Review Problems_files/cmdline_frame.html
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<!-- saved from url=(0070)chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/cmdline_frame.html -->
|
||||||
|
<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/cmdline_frame.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/cvimrc_parser.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/session.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/utils.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/dom.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/hints.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/bookmarks.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/keys.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/clipboard.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/complete.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/mappings.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/find.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/cursor.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/status.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/hud.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/visual.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/command.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/scroll.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/search.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/frames.js"></script>
|
||||||
|
<script src="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/messenger.js"></script>
|
||||||
|
<link rel="stylesheet" href="chrome-extension://ihlenndgcmojhcghmfjfneahoeklbjjh/content_scripts/main.css">
|
||||||
|
<style>#cVim-command-bar, #cVim-command-bar-mode, #cVim-command-bar-input, #cVim-command-bar-search-results,
|
||||||
|
.cVim-completion-item, .cVim-completion-item .cVim-full, .cVim-completion-item .cVim-left,
|
||||||
|
.cVim-completion-item .cVim-right {
|
||||||
|
font-family: Helvetica, Helvetica Neue, Neue, sans-serif, monospace, Arial;
|
||||||
|
font-size: 10pt !important;
|
||||||
|
-webkit-font-smoothing: antialiased !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-command-bar {
|
||||||
|
position: fixed;
|
||||||
|
z-index: 2147483646;
|
||||||
|
background-color: #1b1d1e;
|
||||||
|
color: #bbb;
|
||||||
|
display: none;
|
||||||
|
box-sizing: content-box;
|
||||||
|
box-shadow: 0 3px 3px rgba(0,0,0,0.4);
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-command-bar-mode {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding-left: 2px;
|
||||||
|
height: 100%;
|
||||||
|
width: 10px;
|
||||||
|
padding-top: 2px;
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-command-bar-input {
|
||||||
|
background-color: #1b1d1e;
|
||||||
|
color: #bbb;
|
||||||
|
height: 100%;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
width: calc(100% - 10px);
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-command-bar-search-results {
|
||||||
|
position: fixed;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
z-index: 2147483647;
|
||||||
|
left: 0;
|
||||||
|
box-shadow: 0 3px 3px rgba(0,0,0,0.4);
|
||||||
|
background-color: #1c1c1c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item, .cVim-completion-item .cVim-full, .cVim-completion-item .cVim-left, .cVim-completion-item .cVim-right {
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
padding: 1px;
|
||||||
|
display: inline-block;
|
||||||
|
box-sizing: border-box;
|
||||||
|
vertical-align: middle;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item:nth-child(even) {
|
||||||
|
background-color: #1f1f1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item {
|
||||||
|
width: 100%; left: 0;
|
||||||
|
color: #bcbcbc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item[active] {
|
||||||
|
width: 100%; left: 0;
|
||||||
|
color: #1b1d1e;
|
||||||
|
background-color: #f1f1f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item[active] span {
|
||||||
|
color: #1b1d1e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item .cVim-left {
|
||||||
|
color: #fff;
|
||||||
|
width: 37%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-completion-item .cVim-right {
|
||||||
|
font-style: italic;
|
||||||
|
color: #888;
|
||||||
|
width: 57%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#cVim-link-container, .cVim-link-hint,
|
||||||
|
#cVim-hud, #cVim-status-bar {
|
||||||
|
font-family: Helvetica, Helvetica Neue, Neue, sans-serif, monospace, Arial;
|
||||||
|
font-size: 10pt !important;
|
||||||
|
-webkit-font-smoothing: antialiased !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-link-container {
|
||||||
|
position: absolute;
|
||||||
|
pointer-events: none;
|
||||||
|
width: 100%; left: 0;
|
||||||
|
height: 100%; top: 0;
|
||||||
|
z-index: 2147483647;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-link-hint {
|
||||||
|
position: absolute;
|
||||||
|
color: #302505 !important;
|
||||||
|
background-color: #ffd76e !important;
|
||||||
|
border-radius: 2px !important;
|
||||||
|
padding: 2px !important;
|
||||||
|
font-size: 8pt !important;
|
||||||
|
font-weight: 500 !important;
|
||||||
|
text-transform: uppercase !important;
|
||||||
|
border: 1px solid #ad810c;
|
||||||
|
display: inline-block !important;
|
||||||
|
vertical-align: middle !important;
|
||||||
|
text-align: center !important;
|
||||||
|
box-shadow: 2px 2px 1px rgba(0,0,0,0.25) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cVim-link-hint_match {
|
||||||
|
color: #777;
|
||||||
|
text-transform: uppercase !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#cVim-hud {
|
||||||
|
background-color: rgba(28,28,28,0.9);
|
||||||
|
position: fixed !important;
|
||||||
|
transition: right 0.2s ease-out;
|
||||||
|
z-index: 24724289;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-hud span {
|
||||||
|
padding: 2px;
|
||||||
|
padding-left: 4px;
|
||||||
|
padding-right: 4px;
|
||||||
|
color: #8f8f8f;
|
||||||
|
font-size: 10pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cVim-frames-outline {
|
||||||
|
position: fixed;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 9999999999;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 3px solid yellow;
|
||||||
|
}
|
||||||
|
</style></head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
|
||||||
|
</body><div id="cVim-status-bar" style="top: 0px;"></div><div id="cVim-command-bar" spellcheck="false" style="top: 0px;"><span id="cVim-command-bar-mode"></span><input type="text" id="cVim-command-bar-input"></div><div id="cVim-command-bar-search-results" style="top: 20px;"></div></html>
|
11
agreement.txt
Normal file
11
agreement.txt
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
I have familiarized myself with the contents of the CSCI 4061 syllabus
|
||||||
|
and agree to abide by the policies contained within it. I will obey
|
||||||
|
the PRIME DIRECTIVE. I understand that the Kauffman section of 4061
|
||||||
|
(001) is not coordinated with the Tripathi section (010) and will not
|
||||||
|
seek or render unauthorized help from students or staff in that
|
||||||
|
section. As a University of Minnesota student, I agree to follow the
|
||||||
|
Student Code of Conduct and will treat my classmates and the course
|
||||||
|
staff with honest respect.
|
||||||
|
|
||||||
|
Signed,
|
||||||
|
Michael Zhang
|
BIN
atoms
Executable file
BIN
atoms
Executable file
Binary file not shown.
53
atoms.c
Normal file
53
atoms.c
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char elem[2];
|
||||||
|
double x, y, z;
|
||||||
|
int charge;
|
||||||
|
double mass;
|
||||||
|
} atom_t;
|
||||||
|
|
||||||
|
void write_atoms(char *fname, atom_t *atoms, int len) {
|
||||||
|
int fd = open(fname, O_CREAT | O_WRONLY);
|
||||||
|
for (int i = 0; i < len; ++i) {
|
||||||
|
write(fd, &atoms[i], sizeof(atom_t));
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
double *read_masses(char *fname, int *setlen) {
|
||||||
|
int fd = open(fname, O_RDONLY);
|
||||||
|
int size = lseek(fd, 0, SEEK_END);
|
||||||
|
double *result = (double *)malloc(size);
|
||||||
|
lseek(fd, 0, SEEK_SET);
|
||||||
|
int count = 0;
|
||||||
|
atom_t atom;
|
||||||
|
while (1) {
|
||||||
|
int bytes = read(fd, &atom, sizeof(atom_t));
|
||||||
|
if (!bytes) break;
|
||||||
|
result[count++] = atom.mass;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
*setlen = count;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
atom_t atoms[5] = {{"C", 0.0, 1.0, 2.5, 0, 12.011},
|
||||||
|
{"O", 1.0, 3.5, 6.0, 0, 15.999}};
|
||||||
|
write_atoms("atoms.dat", atoms, 5);
|
||||||
|
int len = -1;
|
||||||
|
double *masses = read_masses("atoms.dat", &len);
|
||||||
|
printf("read %d masses:\n", len);
|
||||||
|
for (int i = 0; i < len; ++i) {
|
||||||
|
printf("mass[%d] = %lf\n", i, masses[i]);
|
||||||
|
}
|
||||||
|
free(masses);
|
||||||
|
return 0;
|
||||||
|
}
|
BIN
atoms.dat
Normal file
BIN
atoms.dat
Normal file
Binary file not shown.
0
b
Normal file
0
b
Normal file
67
lab01-code/QUESTIONS.txt
Normal file
67
lab01-code/QUESTIONS.txt
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
__________________
|
||||||
|
|
||||||
|
LAB 01 QUESTIONS
|
||||||
|
__________________
|
||||||
|
|
||||||
|
|
||||||
|
- Name: Michael Zhang
|
||||||
|
- NetID: zhan4854
|
||||||
|
|
||||||
|
Answer the questions below according to the lab specification. Write
|
||||||
|
your answers directly in this text file and submit it to complete Lab01.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 1
|
||||||
|
=========
|
||||||
|
|
||||||
|
Show output of the collatz sequence program starting at 17.
|
||||||
|
|
||||||
|
Enter the starting integer: 17
|
||||||
|
The next value in the Collatz sequence is 52
|
||||||
|
Show output of steps (0:NO, any other int: yes): 1
|
||||||
|
Step 0: 17
|
||||||
|
Step 1: 52
|
||||||
|
Step 2: 26
|
||||||
|
Step 3: 13
|
||||||
|
Step 4: 40
|
||||||
|
Step 5: 20
|
||||||
|
Step 6: 10
|
||||||
|
Step 7: 5
|
||||||
|
Step 8: 16
|
||||||
|
Step 9: 8
|
||||||
|
Step 10: 4
|
||||||
|
Step 11: 2
|
||||||
|
Step 12: 1
|
||||||
|
The starting value 17 converged to 1 in 12 steps
|
||||||
|
|
||||||
|
PROBLEM 2
|
||||||
|
=========
|
||||||
|
|
||||||
|
Paste the Makefile you created for the lcd-clock project below.
|
||||||
|
|
||||||
|
CFLAGS = -Wall -g
|
||||||
|
CC = gcc $(CFLAGS)
|
||||||
|
|
||||||
|
clock_sim: lcd_clock.o lcd_clock_main.o lcd_clock.h lcd_update.o
|
||||||
|
$(CC) -o clock_sim $^
|
||||||
|
@echo "clock_sim ready for duty"
|
||||||
|
|
||||||
|
lcd_clock.o: lcd_clock.c lcd_clock.h
|
||||||
|
$(CC) -c $<
|
||||||
|
|
||||||
|
lcd_clock_main.o: lcd_clock_main.c lcd_clock.h
|
||||||
|
$(CC) -c $<
|
||||||
|
|
||||||
|
lcd_update.o: lcd_update.c lcd_clock.h
|
||||||
|
$(CC) -c $<
|
||||||
|
|
||||||
|
test: clock_tests
|
||||||
|
@echo "Running clock_tests"
|
||||||
|
./clock_tests
|
||||||
|
@echo "Tests Complete"
|
||||||
|
|
||||||
|
clock_tests: lcd_tests.c lcd_clock.o lcd_update.o lcd_clock.h
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o
|
31
lab01-code/collatz/Makefile
Normal file
31
lab01-code/collatz/Makefile
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# See Makefile-commented for explanation
|
||||||
|
CFLAGS = -Wall -g
|
||||||
|
CC = gcc $(CFLAGS)
|
||||||
|
|
||||||
|
collcalc : collatz.o collatz_main.o
|
||||||
|
$(CC) -o collcalc collatz.o collatz_main.o
|
||||||
|
@echo collcalc is ready
|
||||||
|
|
||||||
|
collatz_main.o : collatz_main.c collatz.h
|
||||||
|
$(CC) -c collatz_main.c
|
||||||
|
|
||||||
|
collatz.o : collatz.c collatz.h
|
||||||
|
$(CC) -c $<
|
||||||
|
|
||||||
|
test : collatz_test
|
||||||
|
./collatz_test
|
||||||
|
|
||||||
|
collatz_test : collatz_test.o collatz.o collatz.h
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
collatz_test.o : collatz_test.c collatz.h
|
||||||
|
$(CC) -c $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@echo Cleaning up object files
|
||||||
|
rm -f *.o
|
||||||
|
|
||||||
|
realclean:
|
||||||
|
@echo Removing objects and programs
|
||||||
|
rm -f *.o collcalc collatz_test
|
||||||
|
|
52
lab01-code/collatz/Makefile-commented
Normal file
52
lab01-code/collatz/Makefile-commented
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
# Makefile to create the collatz programs. To use, type
|
||||||
|
# > make
|
||||||
|
# Which will create the collcalc program. Alternatively
|
||||||
|
# > make collcalc
|
||||||
|
# will also create the collcalc program.
|
||||||
|
#
|
||||||
|
# To create the test program and run it do
|
||||||
|
# > make test
|
||||||
|
#
|
||||||
|
# Makefiles are divided into "rules" comprised of target,
|
||||||
|
# dependencies, and commands to execute to finish the target.
|
||||||
|
#
|
||||||
|
# target : dependency1 dependency2
|
||||||
|
# command1
|
||||||
|
# command2
|
||||||
|
# @command3 which is not printed
|
||||||
|
# command4
|
||||||
|
#
|
||||||
|
# Some targets are files to create like the "collcalc" program or
|
||||||
|
# "collatz_main.o" file. Other targets are "virtual" which simply
|
||||||
|
# specify other targets to do or commands to run.
|
||||||
|
|
||||||
|
CFLAGS = -Wall -g # variable holding options to the c compile
|
||||||
|
CC = gcc $(CFLAGS) # variable holding the compilation command
|
||||||
|
|
||||||
|
collcalc : collatz.o collatz_main.o collatz.h # collcalc is a program, depends on two files, is default target
|
||||||
|
$(CC) -o collcalc collatz.o collatz_main.o # when the other files are ready, compile collcalc
|
||||||
|
@echo collcalc is ready # issue a report that the program is ready
|
||||||
|
|
||||||
|
collatz_main.o : collatz_main.c collatz.h # collatz_main.o depends on two source files
|
||||||
|
$(CC) -c collatz_main.c # compile only, don't link yet
|
||||||
|
|
||||||
|
collatz.o : collatz.c collatz.h # collatz.o depends on collatz.c and collatz.h
|
||||||
|
$(CC) -c $< # compile, use shortcut $< which becomes "collatz.c"
|
||||||
|
|
||||||
|
test : collatz_test # test is another target, depends on collatz_test program
|
||||||
|
./collatz_test # when collatz_test exists, run it
|
||||||
|
|
||||||
|
collatz_test : collatz_test.o collatz.o collatz.h # program depends on several object files and header
|
||||||
|
$(CC) -o $@ $^ # compile using shortcuts: $@ becomes collatz_test, $^ is all dependecies
|
||||||
|
|
||||||
|
collatz_test.o : collatz_test.c collatz.h # object file depends on C source and header
|
||||||
|
$(CC) -c $< # compile to object code using shortcut, $< becomes "collatz_test.c"
|
||||||
|
|
||||||
|
clean: # No dependencies: clean is the de facto cleanup target
|
||||||
|
@echo Cleaning up object files # Report what's happening
|
||||||
|
rm -f *.o # Remove all the .o files which are likely no longer needed
|
||||||
|
|
||||||
|
realclean:
|
||||||
|
@echo Removing objects and programs # "realclean" often used to get rid of everything
|
||||||
|
rm -f *.o collcalc collatz_test # remove .o and programs that have been built
|
||||||
|
|
34
lab01-code/collatz/collatz.c
Normal file
34
lab01-code/collatz/collatz.c
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "collatz.h"
|
||||||
|
|
||||||
|
/* Compute the next step in the collatz sequence */
|
||||||
|
int collatz_next(int n){
|
||||||
|
if(n < 1){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else if(n==1){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if(n % 2 == 0){
|
||||||
|
return n / 2;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
return n*3 + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count how many steps are in the collatz sequence
|
||||||
|
int collatz_steps(int n, int print_output){
|
||||||
|
int steps = 0;
|
||||||
|
if(print_output){
|
||||||
|
printf("Step %d: %d\n",steps,n);
|
||||||
|
}
|
||||||
|
while(n > 1){
|
||||||
|
n = collatz_next(n);
|
||||||
|
steps++;
|
||||||
|
if(print_output){
|
||||||
|
printf("Step %d: %d\n",steps,n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return steps;
|
||||||
|
}
|
44
lab01-code/collatz/collatz.h
Normal file
44
lab01-code/collatz/collatz.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
// Header file for collatz problems
|
||||||
|
|
||||||
|
#ifndef COLLATZ_H
|
||||||
|
#define COLLZTZ_H 1
|
||||||
|
|
||||||
|
// Returns next number in the collatz sequence. If parameter n is less
|
||||||
|
// than 1, return -1. If n is equal to 1, return 1 as the sequence has
|
||||||
|
// converged. If n is bigger than 1, determine if it is even or
|
||||||
|
// odd. If n is even, return half its value. If n is odd, return three
|
||||||
|
// times its value plus one.
|
||||||
|
int collatz_next(int n);
|
||||||
|
|
||||||
|
|
||||||
|
// Returns the number of steps to converge to 1 for starting point
|
||||||
|
// n. Use the function collatz_next() in a loop to determine the next
|
||||||
|
// value at each step. Return the number of steps to converge, 15 in
|
||||||
|
// the example below where n=22. If paramter n is less than or equal
|
||||||
|
// to 1, return 0.
|
||||||
|
//
|
||||||
|
// If the argument print_output is zero, this function should not
|
||||||
|
// print anything. If the argument is non-zero, print each step in
|
||||||
|
// the sequence starting with the initial value of at Step 0. For
|
||||||
|
// example, if n=22 and print_output=1, produce output like the
|
||||||
|
// following:
|
||||||
|
//
|
||||||
|
// Step 0: 22
|
||||||
|
// Step 1: 11
|
||||||
|
// Step 2: 34
|
||||||
|
// Step 3: 17
|
||||||
|
// Step 4: 52
|
||||||
|
// Step 5: 26
|
||||||
|
// Step 6: 13
|
||||||
|
// Step 7: 40
|
||||||
|
// Step 8: 20
|
||||||
|
// Step 9: 10
|
||||||
|
// Step 10: 5
|
||||||
|
// Step 11: 16
|
||||||
|
// Step 12: 8
|
||||||
|
// Step 13: 4
|
||||||
|
// Step 14: 2
|
||||||
|
// Step 15: 1
|
||||||
|
int collatz_steps(int n, int print_output);
|
||||||
|
|
||||||
|
#endif
|
BIN
lab01-code/collatz/collatz.o
Normal file
BIN
lab01-code/collatz/collatz.o
Normal file
Binary file not shown.
21
lab01-code/collatz/collatz_main.c
Normal file
21
lab01-code/collatz/collatz_main.c
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "collatz.h"
|
||||||
|
|
||||||
|
int main(int argc, char **argv){
|
||||||
|
int nstart;
|
||||||
|
printf("Enter the starting integer: ");
|
||||||
|
scanf("%d", &nstart);
|
||||||
|
|
||||||
|
int nnext = collatz_next(nstart);
|
||||||
|
printf("The next value in the Collatz sequence is %d\n",nnext);
|
||||||
|
|
||||||
|
int verbose;
|
||||||
|
printf("Show output of steps (0:NO, any other int: yes): ");
|
||||||
|
scanf("%d", &verbose);
|
||||||
|
|
||||||
|
int steps = collatz_steps(nstart,verbose);
|
||||||
|
printf("The starting value %d converged to 1 in %d steps\n",
|
||||||
|
nstart,steps);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
BIN
lab01-code/collatz/collatz_main.o
Normal file
BIN
lab01-code/collatz/collatz_main.o
Normal file
Binary file not shown.
56
lab01-code/collatz/collatz_test.c
Normal file
56
lab01-code/collatz/collatz_test.c
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "collatz.h"
|
||||||
|
|
||||||
|
#define TESTID "P2"
|
||||||
|
int failures = 0;
|
||||||
|
|
||||||
|
void test_next(int test, int n, int expected){
|
||||||
|
int actual = collatz_next(n);
|
||||||
|
if(expected != actual){
|
||||||
|
printf("Failed %s Test %d\nCall: collatz_next(%d)\nExpect: %d\nActual: %d\n",
|
||||||
|
TESTID,test, n,expected,actual);
|
||||||
|
failures++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MAX_SIZE 5096
|
||||||
|
|
||||||
|
void test_steps(int test, int n, int expected){
|
||||||
|
int actual = collatz_steps(n,0);
|
||||||
|
if(expected != actual){
|
||||||
|
printf("Failed %s Test %d\nCall: collatz_steps(%d)\nExpect: %d\nActual: %d\n",
|
||||||
|
TESTID,test, n,expected,actual);
|
||||||
|
failures++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv){
|
||||||
|
int test = 1;
|
||||||
|
test_next(test++, 1 , 1 );
|
||||||
|
test_next(test++, 0 , -1 );
|
||||||
|
test_next(test++, -5 , -1 );
|
||||||
|
test_next(test++, 5 , 16 );
|
||||||
|
test_next(test++, 16 , 8 );
|
||||||
|
test_next(test++, 20 , 10 );
|
||||||
|
test_next(test++, 15 , 46 );
|
||||||
|
|
||||||
|
test_steps(test++, -7, 0 );
|
||||||
|
test_steps(test++, 1, 0 );
|
||||||
|
test_steps(test++, 5, 5 );
|
||||||
|
test_steps(test++, 14, 17);
|
||||||
|
test_steps(test++, 30, 18);
|
||||||
|
test_steps(test++, 22, 15);
|
||||||
|
test_steps(test++, 6, 8 );
|
||||||
|
|
||||||
|
if(failures == 0){
|
||||||
|
printf("OK\n");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
printf("FAILURES\n");
|
||||||
|
}
|
||||||
|
printf("Passed %d / %d tests\n",test-failures,test);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
BIN
lab01-code/collatz/collcalc
Executable file
BIN
lab01-code/collatz/collcalc
Executable file
Binary file not shown.
26
lab01-code/lcd-clock/Makefile
Normal file
26
lab01-code/lcd-clock/Makefile
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
CFLAGS = -Wall -g
|
||||||
|
CC = gcc $(CFLAGS)
|
||||||
|
|
||||||
|
clock_sim: lcd_clock.o lcd_clock_main.o lcd_clock.h lcd_update.o
|
||||||
|
$(CC) -o clock_sim $^
|
||||||
|
@echo "clock_sim ready for duty"
|
||||||
|
|
||||||
|
lcd_clock.o: lcd_clock.c lcd_clock.h
|
||||||
|
$(CC) -c $<
|
||||||
|
|
||||||
|
lcd_clock_main.o: lcd_clock_main.c lcd_clock.h
|
||||||
|
$(CC) -c $<
|
||||||
|
|
||||||
|
lcd_update.o: lcd_update.c lcd_clock.h
|
||||||
|
$(CC) -c $<
|
||||||
|
|
||||||
|
test: clock_tests
|
||||||
|
@echo "Running clock_tests"
|
||||||
|
./clock_tests
|
||||||
|
@echo "Tests Complete"
|
||||||
|
|
||||||
|
clock_tests: lcd_tests.c lcd_clock.o lcd_update.o lcd_clock.h
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o
|
BIN
lab01-code/lcd-clock/clock_tests
Executable file
BIN
lab01-code/lcd-clock/clock_tests
Executable file
Binary file not shown.
130
lab01-code/lcd-clock/lcd_clock.c
Normal file
130
lab01-code/lcd-clock/lcd_clock.c
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "lcd_clock.h"
|
||||||
|
|
||||||
|
#define LCD_MAX_BITS 30
|
||||||
|
|
||||||
|
|
||||||
|
/* Global variable used to control the LCD display. Making changes to
|
||||||
|
this variable will change the clock time */
|
||||||
|
int LCD_DISPLAY_PORT;
|
||||||
|
|
||||||
|
/* Time of day in seconds; set by the hardware, read only */
|
||||||
|
int TIME_OF_DAY_SEC;
|
||||||
|
|
||||||
|
/* Reset an lcd_display to be empty */
|
||||||
|
void reset_lcd_display(lcd_display *lcd){
|
||||||
|
int i,j;
|
||||||
|
for(i=0; i<5; i++){
|
||||||
|
for(j=0; j<32; j++){
|
||||||
|
lcd->chars[i][j] = ' ';
|
||||||
|
}
|
||||||
|
lcd->chars[i][31] = '\0';
|
||||||
|
}
|
||||||
|
lcd->chars[1][12] = 'o';
|
||||||
|
lcd->chars[3][12] = 'o';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print an lcd_display */
|
||||||
|
void print_lcd_display(lcd_display *lcd){
|
||||||
|
int i=0;
|
||||||
|
for(i=0; i<5; i++){
|
||||||
|
printf("%s\n",lcd->chars[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Data and functions to set the state of the lcd clock display */
|
||||||
|
|
||||||
|
/* Position and char in display */
|
||||||
|
typedef struct {
|
||||||
|
int r,c; char ch;
|
||||||
|
} charpos;
|
||||||
|
|
||||||
|
/* Collection of characters corresponding to one bit in the state being set */
|
||||||
|
typedef struct {
|
||||||
|
int len;
|
||||||
|
charpos pos[2];
|
||||||
|
} charpos_coll;
|
||||||
|
|
||||||
|
/* Correspondence of bit positions to which characters should be set */
|
||||||
|
charpos_coll bits2chars[LCD_MAX_BITS] = {
|
||||||
|
{ .len=2, .pos={{ 0,19,'~'}, { 0,20,'~'},} }, // 0
|
||||||
|
{ .len=1, .pos={{ 1,21,'|'}, } }, // 1
|
||||||
|
{ .len=1, .pos={{ 3,21,'|'}, } }, // 2
|
||||||
|
{ .len=2, .pos={{ 4,19,'~'}, { 4,20,'~'},} }, // 3
|
||||||
|
{ .len=1, .pos={{ 3,18,'|'}, } }, // 4
|
||||||
|
{ .len=1, .pos={{ 1,18,'|'}, } }, // 5
|
||||||
|
{ .len=2, .pos={{ 2,19,'~'}, { 2,20,'~'},} }, // 6
|
||||||
|
|
||||||
|
{ .len=2, .pos={{ 0,14,'~'}, { 0,15,'~'},} }, // 7
|
||||||
|
{ .len=1, .pos={{ 1,16,'|'}, } }, // 8
|
||||||
|
{ .len=1, .pos={{ 3,16,'|'}, } }, // 9
|
||||||
|
{ .len=2, .pos={{ 4,14,'~'}, { 4,15,'~'},} }, // 10
|
||||||
|
{ .len=1, .pos={{ 3,13,'|'}, } }, // 11
|
||||||
|
{ .len=1, .pos={{ 1,13,'|'}, } }, // 12
|
||||||
|
{ .len=2, .pos={{ 2,14,'~'}, { 2,15,'~'},} }, // 13
|
||||||
|
|
||||||
|
{ .len=2, .pos={{ 0, 9,'~'}, { 0,10,'~'},} }, // 14
|
||||||
|
{ .len=1, .pos={{ 1,11,'|'}, } }, // 15
|
||||||
|
{ .len=1, .pos={{ 3,11,'|'}, } }, // 16
|
||||||
|
{ .len=2, .pos={{ 4, 9,'~'}, { 4,10,'~'},} }, // 17
|
||||||
|
{ .len=1, .pos={{ 3, 8,'|'}, } }, // 18
|
||||||
|
{ .len=1, .pos={{ 1, 8,'|'}, } }, // 19
|
||||||
|
{ .len=2, .pos={{ 2, 9,'~'}, { 2,10,'~'},} }, // 20
|
||||||
|
|
||||||
|
{ .len=2, .pos={{ 0, 4,'~'}, { 0, 5,'~'},} }, // 21
|
||||||
|
{ .len=1, .pos={{ 1, 6,'|'}, } }, // 22
|
||||||
|
{ .len=1, .pos={{ 3, 6,'|'}, } }, // 23
|
||||||
|
{ .len=2, .pos={{ 4, 4,'~'}, { 4, 5,'~'},} }, // 24
|
||||||
|
{ .len=1, .pos={{ 3, 3,'|'}, } }, // 25
|
||||||
|
{ .len=1, .pos={{ 1, 3,'|'}, } }, // 26
|
||||||
|
{ .len=2, .pos={{ 2, 4,'~'}, { 2, 5,'~'},} }, // 27
|
||||||
|
|
||||||
|
{ .len=2, .pos={{ 3, 0,'A'}, { 3, 1,'M'},} }, // 28
|
||||||
|
{ .len=2, .pos={{ 4, 0,'P'}, { 4, 1,'M'},} }, // 29
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Assumes ints are at least 32 bits */
|
||||||
|
void set_lcd_display_state(lcd_display *lcd, int state){
|
||||||
|
int i,j;
|
||||||
|
int mask = 0x1;
|
||||||
|
reset_lcd_display(lcd);
|
||||||
|
for(i=0; i<LCD_MAX_BITS; i++){
|
||||||
|
if( state & (mask << i) ){ // ith bit set, fill in characters
|
||||||
|
charpos_coll coll = bits2chars[i];
|
||||||
|
for(j=0; j<coll.len; j+=2){
|
||||||
|
charpos pos = coll.pos[j];
|
||||||
|
lcd->chars[pos.r][pos.c] = pos.ch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Use the global LCD_DISPLAY_PORT to print the time */
|
||||||
|
void print_lcd_clock(){
|
||||||
|
lcd_display lcd;
|
||||||
|
set_lcd_display_state(&lcd, LCD_DISPLAY_PORT);
|
||||||
|
print_lcd_display(&lcd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Print the most signficant (right-most) to least signficant bit in
|
||||||
|
the integer passed in */
|
||||||
|
#define INT_BITS 32
|
||||||
|
void showbits(int x){
|
||||||
|
int i;
|
||||||
|
int mask = 0x1;
|
||||||
|
for(i=INT_BITS-1; i>=0; i--){
|
||||||
|
int shifted_mask = mask << i;
|
||||||
|
if(shifted_mask & x){
|
||||||
|
putchar('1');
|
||||||
|
} else {
|
||||||
|
putchar('0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Equivalent short version */
|
||||||
|
// (x&(1<<i)) ? putchar('1'): putchar('0');
|
||||||
|
}
|
42
lab01-code/lcd-clock/lcd_clock.h
Normal file
42
lab01-code/lcd-clock/lcd_clock.h
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#ifndef LCD_CLOCK_H
|
||||||
|
#define LCD_CLOCK_H 1
|
||||||
|
|
||||||
|
/* Global variable used to control the LCD display. Making changes to
|
||||||
|
this variable will change the clock time */
|
||||||
|
extern int LCD_DISPLAY_PORT;
|
||||||
|
|
||||||
|
/* Time of day in seconds; set by the hardward, read only */
|
||||||
|
extern int TIME_OF_DAY_SEC;
|
||||||
|
|
||||||
|
/* Convenience struct for representing the LCD clock as characters */
|
||||||
|
typedef struct {
|
||||||
|
char chars[5][32];
|
||||||
|
} lcd_display;
|
||||||
|
|
||||||
|
/* Use the global LCD_DISPLAY_PORT to print the time */
|
||||||
|
void print_lcd_clock();
|
||||||
|
|
||||||
|
/* Print the most signficant (right-most) to least signficant bit in
|
||||||
|
the integer passed in */
|
||||||
|
void showbits(int x);
|
||||||
|
|
||||||
|
// Breaks time down into 12-hour format
|
||||||
|
typedef struct{
|
||||||
|
int hours;
|
||||||
|
int minutes;
|
||||||
|
int seconds;
|
||||||
|
int ispm;
|
||||||
|
} tod_t;
|
||||||
|
|
||||||
|
// Breaks down the give time of day in seconds into a tod_t struct
|
||||||
|
tod_t time_breakdown(int time_of_day);
|
||||||
|
|
||||||
|
// Produce an integer which are the bits representing how the LCD
|
||||||
|
// should display based on the given time of day
|
||||||
|
int display_bits_from_tod(tod_t tod);
|
||||||
|
|
||||||
|
// Update the global variable LCD_DISPLAY_PORT to match the current
|
||||||
|
// time of day
|
||||||
|
void lcd_update();
|
||||||
|
|
||||||
|
#endif
|
68
lab01-code/lcd-clock/lcd_clock_main.c
Normal file
68
lab01-code/lcd-clock/lcd_clock_main.c
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "lcd_clock.h"
|
||||||
|
|
||||||
|
int main(int argc, char **argv){
|
||||||
|
|
||||||
|
if(argc < 2){ /* Set TIME_OF_DAY_SEC to the actual time */
|
||||||
|
time_t rawtime; /* Get raw time */
|
||||||
|
time( &rawtime );
|
||||||
|
struct tm *info; /* Store broken down time */
|
||||||
|
info = localtime( &rawtime ); /* Get a broken down time */
|
||||||
|
|
||||||
|
/* Calculate the seconds since the beginning of the day */
|
||||||
|
TIME_OF_DAY_SEC = info->tm_sec + 60*info->tm_min + 60*60*info->tm_hour;
|
||||||
|
}
|
||||||
|
else{ /* Set time based on argument given */
|
||||||
|
TIME_OF_DAY_SEC = atoi(argv[1]);
|
||||||
|
}
|
||||||
|
printf("TIME_OF_DAY_SEC set to: %d\n", TIME_OF_DAY_SEC);
|
||||||
|
|
||||||
|
int time_max = 24 * 60 * 60;
|
||||||
|
if(TIME_OF_DAY_SEC >= time_max){
|
||||||
|
printf("Time %d exceeds max %d\n",TIME_OF_DAY_SEC,time_max);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tod_t tod = time_breakdown(TIME_OF_DAY_SEC);
|
||||||
|
|
||||||
|
printf("tod = time_breakdown( %5d );\n",TIME_OF_DAY_SEC);
|
||||||
|
|
||||||
|
printf("tod is { \n");
|
||||||
|
printf(" .hours = %d\n",tod.hours);
|
||||||
|
printf(" .minutes = %d\n",tod.minutes);
|
||||||
|
printf(" .seconds = %d\n",tod.seconds);
|
||||||
|
printf(" .ispm = %d\n",tod.ispm);
|
||||||
|
printf("} \n");
|
||||||
|
printf("Simulated time is: %02d : %02d : %02d %s\n",
|
||||||
|
tod.hours,tod.minutes,tod.seconds,(tod.ispm ? "pm" : "am"));
|
||||||
|
|
||||||
|
printf("\nChecking results for display bits\n");
|
||||||
|
|
||||||
|
int state = display_bits_from_tod(tod);
|
||||||
|
printf("state = display_bits_from_tod(tod);\n");
|
||||||
|
|
||||||
|
printf("\nstate is:\n");
|
||||||
|
printf(" 3 2 1 0\n");
|
||||||
|
printf("index: 10987654321098765432109876543210\n");
|
||||||
|
printf("bits: "); showbits(state); printf("\n");
|
||||||
|
printf("guide: | | | | |\n");
|
||||||
|
|
||||||
|
printf("\nRunning lcd_update()\n");
|
||||||
|
|
||||||
|
lcd_update();
|
||||||
|
|
||||||
|
printf("\nLCD_DISPLAY_PORT is:\n");
|
||||||
|
printf(" 3 2 1 0\n");
|
||||||
|
printf("index: 10987654321098765432109876543210\n");
|
||||||
|
printf("bits: "); showbits(LCD_DISPLAY_PORT); printf("\n");
|
||||||
|
printf("guide: | | | | |\n");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
printf("\nLCD Clock Display:\n");
|
||||||
|
print_lcd_clock();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
221
lab01-code/lcd-clock/lcd_tests.c
Normal file
221
lab01-code/lcd-clock/lcd_tests.c
Normal file
|
@ -0,0 +1,221 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "lcd_clock.h"
|
||||||
|
|
||||||
|
#define TESTID "lcd_update.c"
|
||||||
|
int failures = 0;
|
||||||
|
int testn = 0;
|
||||||
|
|
||||||
|
#define TOLERANCE 1e-4
|
||||||
|
|
||||||
|
#define GENTEST 0
|
||||||
|
|
||||||
|
int compare_tod_t(tod_t x, tod_t y){
|
||||||
|
return
|
||||||
|
x.hours == y.hours &&
|
||||||
|
x.minutes == y.minutes &&
|
||||||
|
x.seconds == y.seconds &&
|
||||||
|
x.ispm == y.ispm;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_tod_t(tod_t tod){
|
||||||
|
printf("{\n");
|
||||||
|
printf(" .hours = %d,\n",tod.hours);
|
||||||
|
printf(" .minutes = %d,\n",tod.minutes);
|
||||||
|
printf(" .seconds = %d,\n",tod.seconds);
|
||||||
|
printf(" .ispm = %d,\n",tod.ispm);
|
||||||
|
printf("}\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_time_breakdown(int time_sec, tod_t expect){
|
||||||
|
testn++;
|
||||||
|
printf("Running %s Test %d for time_breakdown()\n", TESTID,testn);
|
||||||
|
TIME_OF_DAY_SEC = -1;
|
||||||
|
LCD_DISPLAY_PORT = -1;
|
||||||
|
|
||||||
|
tod_t actual = time_breakdown(time_sec);
|
||||||
|
|
||||||
|
if(TIME_OF_DAY_SEC != -1 || LCD_DISPLAY_PORT != -1){
|
||||||
|
printf("\nFailed %s Test %d for time_breakdown()\n", TESTID,testn);
|
||||||
|
printf("Do not modify TIME_OF_DAY_SEC or LCD_DISPLAY_PORT in this function\n");
|
||||||
|
failures++;
|
||||||
|
}
|
||||||
|
else if( !compare_tod_t(actual,expect) ){
|
||||||
|
printf("\nFailed %s Test %d for time_breakdown()\n", TESTID,testn);
|
||||||
|
printf("Actual and Expected tod_t differ\n");
|
||||||
|
printf("time_sec: %d\n",time_sec);
|
||||||
|
printf("EXPECT: "); print_tod_t(expect);
|
||||||
|
printf("ACTUAL: "); print_tod_t(actual);
|
||||||
|
failures++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_display_bits_from_tod(tod_t tod, int expect){
|
||||||
|
testn++;
|
||||||
|
printf("Running %s Test %d for display_bits_from_tod()\n", TESTID,testn);
|
||||||
|
TIME_OF_DAY_SEC = -1;
|
||||||
|
LCD_DISPLAY_PORT = -1;
|
||||||
|
|
||||||
|
int actual = display_bits_from_tod(tod);
|
||||||
|
|
||||||
|
if(TIME_OF_DAY_SEC != -1 || LCD_DISPLAY_PORT != -1){
|
||||||
|
printf("\nFailed %s Test %d for display_bits_from_tod()\n", TESTID,testn);
|
||||||
|
printf("Do not modify TIME_OF_DAY_SEC or LCD_DISPLAY_PORT in this function\n");
|
||||||
|
failures++;
|
||||||
|
}
|
||||||
|
else if(actual != expect){
|
||||||
|
printf("\nFailed %s Test %d for display_bits_from_tod()\n", TESTID,testn);
|
||||||
|
printf("Actual and Expected bits differ\n");
|
||||||
|
printf("tod = \n"); print_tod_t(tod);
|
||||||
|
printf(" 3 2 1 0\n");
|
||||||
|
printf("index: 10987654321098765432109876543210\n");
|
||||||
|
printf("EXPECT: "); showbits(expect); printf("\n");
|
||||||
|
printf("ACTUAL: "); showbits(actual); printf("\n");
|
||||||
|
printf("guide: | | | | |\n");
|
||||||
|
printf("\n");
|
||||||
|
failures++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_lcd_update(int time_sec, int expect){
|
||||||
|
testn++;
|
||||||
|
printf("Running %s Test %d for lcd_update()\n", TESTID,testn);
|
||||||
|
TIME_OF_DAY_SEC = time_sec;
|
||||||
|
lcd_update();
|
||||||
|
if(LCD_DISPLAY_PORT != expect || TIME_OF_DAY_SEC != time_sec){
|
||||||
|
printf("\nFailed %s Test %d for lcd_update()\n", TESTID,testn);
|
||||||
|
printf("Expect TIME_OF_DAY_SEC: %d\n",time_sec);
|
||||||
|
printf("Actual TIME_OF_DAY_SEC: %d\n",TIME_OF_DAY_SEC);
|
||||||
|
printf("Bits of LCD_DISPLAY_PORT\n");
|
||||||
|
printf("index: 10987654321098765432109876543210\n");
|
||||||
|
printf("EXPECT: "); showbits(expect); printf("\n");
|
||||||
|
printf("ACTUAL: "); showbits(LCD_DISPLAY_PORT); printf("\n");
|
||||||
|
printf("guide: | | | | |\n");
|
||||||
|
printf("\n");
|
||||||
|
failures++;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int time_sec;
|
||||||
|
tod_t tod;
|
||||||
|
int bits;
|
||||||
|
} lcd_test_case;
|
||||||
|
|
||||||
|
/* Global array of test data; terminated by a struct with time_sec=-1 */
|
||||||
|
lcd_test_case tests[] = {
|
||||||
|
{ .time_sec = 0,
|
||||||
|
.tod = {
|
||||||
|
.hours = 12,
|
||||||
|
.minutes = 0,
|
||||||
|
.seconds = 0,
|
||||||
|
.ispm = 0,
|
||||||
|
},
|
||||||
|
.bits=0b00010000110101101101111110111111,
|
||||||
|
},
|
||||||
|
{ .time_sec = 101,
|
||||||
|
.tod = {
|
||||||
|
.hours = 12,
|
||||||
|
.minutes = 1,
|
||||||
|
.seconds = 41,
|
||||||
|
.ispm = 0,
|
||||||
|
},
|
||||||
|
.bits=0b00010000110101101101111110000110,
|
||||||
|
},
|
||||||
|
{ .time_sec = 4170,
|
||||||
|
.tod = {
|
||||||
|
.hours = 1,
|
||||||
|
.minutes = 9,
|
||||||
|
.seconds = 30,
|
||||||
|
.ispm = 0,
|
||||||
|
},
|
||||||
|
.bits=0b00010000000000011001111111101111,
|
||||||
|
},
|
||||||
|
{ .time_sec = 43199,
|
||||||
|
.tod = {
|
||||||
|
.hours = 11,
|
||||||
|
.minutes = 59,
|
||||||
|
.seconds = 59,
|
||||||
|
.ispm = 0,
|
||||||
|
},
|
||||||
|
.bits=0b00010000110000011011011011101111,
|
||||||
|
},
|
||||||
|
{ .time_sec = 43200,
|
||||||
|
.tod = {
|
||||||
|
.hours = 12,
|
||||||
|
.minutes = 0,
|
||||||
|
.seconds = 0,
|
||||||
|
.ispm = 1,
|
||||||
|
},
|
||||||
|
.bits=0b00100000110101101101111110111111,
|
||||||
|
},
|
||||||
|
{ .time_sec = 47089,
|
||||||
|
.tod = {
|
||||||
|
.hours = 1,
|
||||||
|
.minutes = 4,
|
||||||
|
.seconds = 49,
|
||||||
|
.ispm = 1,
|
||||||
|
},
|
||||||
|
.bits=0b00100000000000011001111111100110,
|
||||||
|
},
|
||||||
|
{ .time_sec = 67089,
|
||||||
|
.tod = {
|
||||||
|
.hours = 6,
|
||||||
|
.minutes = 38,
|
||||||
|
.seconds = 9,
|
||||||
|
.ispm = 1,
|
||||||
|
},
|
||||||
|
.bits=0b00100000000111110110011111111111,
|
||||||
|
},
|
||||||
|
{ .time_sec = 86399,
|
||||||
|
.tod = {
|
||||||
|
.hours = 11,
|
||||||
|
.minutes = 59,
|
||||||
|
.seconds = 59,
|
||||||
|
.ispm = 1,
|
||||||
|
},
|
||||||
|
.bits=0b00100000110000011011011011101111,
|
||||||
|
},
|
||||||
|
{ .time_sec = 46348,
|
||||||
|
.tod = {
|
||||||
|
.hours = 12,
|
||||||
|
.minutes = 52,
|
||||||
|
.seconds = 28,
|
||||||
|
.ispm = 1,
|
||||||
|
},
|
||||||
|
.bits=0b00100000110101101111011011011011,
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
{ .time_sec = -1, },
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char **argv){
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Run time_breakdown() tests */
|
||||||
|
for(i=0; tests[i].time_sec != -1; i++){
|
||||||
|
test_time_breakdown(tests[i].time_sec,tests[i].tod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Run display_bits_from_tod() tests */
|
||||||
|
for(i=0; tests[i].time_sec != -1; i++){
|
||||||
|
test_display_bits_from_tod(tests[i].tod,tests[i].bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Run lcd_update() tests */
|
||||||
|
for(i=0; tests[i].time_sec != -1; i++){
|
||||||
|
test_lcd_update(tests[i].time_sec,tests[i].bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s Tests Passed/Run: %d / %d\n",TESTID,(testn-failures),testn);
|
||||||
|
|
||||||
|
return failures;
|
||||||
|
}
|
60
lab01-code/lcd-clock/lcd_update.c
Normal file
60
lab01-code/lcd-clock/lcd_update.c
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
#include "lcd_clock.h"
|
||||||
|
|
||||||
|
|
||||||
|
// Breaks down the give time of day in seconds into a tod_t struct
|
||||||
|
tod_t time_breakdown(int time_of_day_sec){
|
||||||
|
int tod_hours = time_of_day_sec / 3600;
|
||||||
|
int ispm = tod_hours >= 12 ? 1 : 0;
|
||||||
|
tod_hours = tod_hours % 12;
|
||||||
|
tod_hours = tod_hours == 0 ? 12 : tod_hours;
|
||||||
|
int tod_minutes = (time_of_day_sec / 60) % 60;
|
||||||
|
int tod_seconds = time_of_day_sec % 60;
|
||||||
|
tod_t tod = {.hours = tod_hours,
|
||||||
|
.minutes = tod_minutes,
|
||||||
|
.seconds = tod_seconds,
|
||||||
|
.ispm = ispm};
|
||||||
|
return tod;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Binary masks for each digit for ease of setting
|
||||||
|
int digit_masks[10] = {
|
||||||
|
0b0111111, // zero
|
||||||
|
0b0000110, // one
|
||||||
|
0b1011011, // two
|
||||||
|
0b1001111, // three
|
||||||
|
0b1100110, // four
|
||||||
|
0b1101101, // five
|
||||||
|
0b1111101, // six
|
||||||
|
0b0000111, // seven
|
||||||
|
0b1111111, // eight
|
||||||
|
0b1101111, // nine
|
||||||
|
};
|
||||||
|
|
||||||
|
#define BLANK 0b0000000 // blank
|
||||||
|
#define AM_MASK (0x1 << 28)
|
||||||
|
#define PM_MASK (0x1 << 29)
|
||||||
|
|
||||||
|
int display_bits_from_tod(tod_t tod){
|
||||||
|
int hr_tens = tod.hours >= 10 ? digit_masks[1] : BLANK;
|
||||||
|
int hr_ones = digit_masks[tod.hours % 10];
|
||||||
|
int mn_tens = digit_masks[tod.minutes / 10];
|
||||||
|
int mn_ones = digit_masks[tod.minutes % 10];
|
||||||
|
int ampm = tod.ispm ? PM_MASK : AM_MASK;
|
||||||
|
|
||||||
|
int state = 0;
|
||||||
|
state |= (mn_ones << 0);
|
||||||
|
state |= (mn_tens << 7);
|
||||||
|
state |= (hr_ones << 14);
|
||||||
|
state |= (hr_tens << 21);
|
||||||
|
state |= ampm;
|
||||||
|
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Examine the TIME_OF_DAY_SEC to determine hour, minute, and am/pm.
|
||||||
|
Set the LCD_DISPLAY_PORT bits to show the proper time. */
|
||||||
|
void lcd_update(){
|
||||||
|
tod_t tod = time_breakdown(TIME_OF_DAY_SEC);
|
||||||
|
int state = display_bits_from_tod(tod);
|
||||||
|
LCD_DISPLAY_PORT = state;
|
||||||
|
}
|
12
lab01-code/lcd-clock/time-examples.sh
Executable file
12
lab01-code/lcd-clock/time-examples.sh
Executable file
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Loop to produce various example times. clock_sim program must be
|
||||||
|
# built preceding use.
|
||||||
|
|
||||||
|
for t in 999 7777 121212; do
|
||||||
|
echo '> clock_sim' $t
|
||||||
|
./clock_sim $t
|
||||||
|
echo
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
42
lab01-code/lcd-clock/time_breakdown_examples.c
Normal file
42
lab01-code/lcd-clock/time_breakdown_examples.c
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "hw6.h"
|
||||||
|
#include "lcd_clock.h"
|
||||||
|
|
||||||
|
int main(int argc, char **argv){
|
||||||
|
|
||||||
|
if(argc < 2){ /* Set TIME_OF_DAY_SEC to the actual time */
|
||||||
|
time_t rawtime; /* Get raw time */
|
||||||
|
time( &rawtime );
|
||||||
|
struct tm *info; /* Store broken down time */
|
||||||
|
info = localtime( &rawtime ); /* Get a broken down time */
|
||||||
|
|
||||||
|
/* Calculate the seconds since the beginning of the day */
|
||||||
|
TIME_OF_DAY_SEC = info->tm_sec + 60*info->tm_min + 60*60*info->tm_hour;
|
||||||
|
}
|
||||||
|
else{ /* Set time based on argument given */
|
||||||
|
TIME_OF_DAY_SEC = atoi(argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int time_max = 24 * 60 * 60;
|
||||||
|
if(TIME_OF_DAY_SEC >= time_max){
|
||||||
|
printf("Time %d exceeds max %d\n",TIME_OF_DAY_SEC,time_max);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tod_t tod = time_breakdown(TIME_OF_DAY_SEC);
|
||||||
|
|
||||||
|
printf("tod = time_breakdown( %5d ); //",TIME_OF_DAY_SEC);
|
||||||
|
|
||||||
|
printf(" %02d : %02d : %02d %s\n",
|
||||||
|
tod.hours,tod.minutes,tod.seconds,(tod.ispm ? "pm" : "am"));
|
||||||
|
|
||||||
|
printf("tod is { \n");
|
||||||
|
printf(" .hours = %d\n",tod.hours);
|
||||||
|
printf(" .minutes = %d\n",tod.minutes);
|
||||||
|
printf(" .seconds = %d\n",tod.seconds);
|
||||||
|
printf(" .ispm = %d\n",tod.ispm);
|
||||||
|
printf("} \n");
|
||||||
|
return 0;
|
||||||
|
}
|
182
lab02-code/QUESTIONS.txt
Normal file
182
lab02-code/QUESTIONS.txt
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
__________________
|
||||||
|
|
||||||
|
LAB 02 QUESTIONS
|
||||||
|
__________________
|
||||||
|
|
||||||
|
|
||||||
|
- Name: Michael Zhang
|
||||||
|
- NetID: zhan4854
|
||||||
|
|
||||||
|
Answer the questions below according to the lab specification. Write
|
||||||
|
your answers directly in this text file and submit it to complete Lab01.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 1 `fork1.c'
|
||||||
|
===================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Compile and run the program in `fork1.c'. Show it's output below.
|
||||||
|
|
||||||
|
I am number 1, my pid is 9162
|
||||||
|
I am number 0, my pid is 9161
|
||||||
|
I am number 3, my pid is 9164
|
||||||
|
I am number 8, my pid is 9160
|
||||||
|
I am number 4, my pid is 9165
|
||||||
|
I am number 2, my pid is 9163
|
||||||
|
I am number 7, my pid is 9168
|
||||||
|
I am number 5, my pid is 9166
|
||||||
|
I am number 6, my pid is 9167
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
Is the output ordered or disordered with respect to the "I am
|
||||||
|
number..." statements? Why?
|
||||||
|
|
||||||
|
It's disordered in that the output has been printed to the screen out of order,
|
||||||
|
because spawning each process and then executing the print statement could take
|
||||||
|
an indeterminate amount of time for each process, so it ends up out of order.
|
||||||
|
However, PIDs are in the same order as the child's number, since PIDs are usually
|
||||||
|
created in an incremental manner so processes created later will have a larger
|
||||||
|
PID.
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
Add calls to the wait() or waitpid() function to ensure that the
|
||||||
|
output is ordered.
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
pid_t child = fork();
|
||||||
|
if (child == 0) {
|
||||||
|
break;
|
||||||
|
} else { // make sure this is only executed on the parent process
|
||||||
|
waitpid(child, 0, 0); // wait for the child process to exit with status 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("I am number %d, my pid is %d\n", i, getpid());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
D
|
||||||
|
~
|
||||||
|
|
||||||
|
How many parents and children are there in this program? What is their
|
||||||
|
arrangement?
|
||||||
|
|
||||||
|
There's 1 parent and 8 children, with the parent process printing "I am
|
||||||
|
number 8" (since it only prints after it's spawned all the children, leaving
|
||||||
|
i = 8 when it reaches the printf statement).
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 2 `fork-exec1.c'
|
||||||
|
========================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Compile and run the program in `fork-exec1.c'. Show it's output below.
|
||||||
|
|
||||||
|
Running command 'ls'
|
||||||
|
------------------
|
||||||
|
total 84K
|
||||||
|
drwxr-xr-x 2 michael michael 4.0K Sep 18 02:26 .
|
||||||
|
drwxrwxr-x 4 michael michael 4.0K Sep 18 02:18 ..
|
||||||
|
-rwxrwxr-x 1 michael michael 8.6K Sep 18 02:24 fork1
|
||||||
|
-rw-r--r-- 1 michael michael 408 Sep 18 02:25 fork1.c
|
||||||
|
-rwxrwxr-x 1 michael michael 8.6K Sep 18 02:26 fork-exec1
|
||||||
|
-rw-r--r-- 1 michael michael 360 Sep 13 13:56 fork-exec1.c
|
||||||
|
-rw-r--r-- 1 michael michael 2.4K Sep 18 02:26 QUESTIONS.txt
|
||||||
|
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
Adjust the contents of the `child_argv[]' array. Try remove the "-l"
|
||||||
|
element, try adding on ".." prior to the final NULL, or make other
|
||||||
|
modifications INCLUDING for the 0th "ls" string. Recompile and
|
||||||
|
describe whether the output has changed.
|
||||||
|
|
||||||
|
Changed the line to:
|
||||||
|
char *child_argv[] = {"ls","-lc","-ah","/home",NULL};
|
||||||
|
|
||||||
|
Ouptut:
|
||||||
|
|
||||||
|
Running command 'ls'
|
||||||
|
------------------
|
||||||
|
total 24K
|
||||||
|
drwxr-xr-x 4 root root 4.0K Sep 5 10:27 .
|
||||||
|
drwxr-xr-x 24 root root 4.0K Sep 12 17:24 ..
|
||||||
|
drwxr-xr-x 3 root root 4.0K Sep 5 10:27 .ecryptfs
|
||||||
|
drwx------ 44 michael michael 12K Sep 18 02:29 michael
|
||||||
|
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
Change the child_cmd string from "ls" to be something else like "gcc"
|
||||||
|
or "cat". Recompile ad explain what happens now.
|
||||||
|
|
||||||
|
Changed the line to:
|
||||||
|
char *child_argv[] = {"--", "derpalerp",NULL};
|
||||||
|
char *child_cmd = "cowsay";
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
Running command 'cowsay'
|
||||||
|
------------------
|
||||||
|
___________
|
||||||
|
< derpalerp >
|
||||||
|
-----------
|
||||||
|
\ ^__^
|
||||||
|
\ (oo)\_______
|
||||||
|
(__)\ )\/\
|
||||||
|
||----w |
|
||||||
|
|| ||
|
||||||
|
|
||||||
|
|
||||||
|
D
|
||||||
|
~
|
||||||
|
|
||||||
|
Currently `fork-exec1.c' does not reach the bottom statements.
|
||||||
|
,----
|
||||||
|
| printf("------------------\n");
|
||||||
|
| printf("Finished\n");
|
||||||
|
`----
|
||||||
|
Correct this by doing the following:
|
||||||
|
- Fork a child process
|
||||||
|
- Have ONLY the child process call execvp()
|
||||||
|
- Have the parent process wait() for the child
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(void){
|
||||||
|
|
||||||
|
char *child_argv[] = {"--", "derpalerp",NULL};
|
||||||
|
char *child_cmd = "cowsay";
|
||||||
|
|
||||||
|
printf("Running command '%s'\n",child_cmd);
|
||||||
|
printf("------------------\n");
|
||||||
|
|
||||||
|
pid_t child = fork();
|
||||||
|
if (child == 0) { // child
|
||||||
|
execvp(child_cmd,child_argv);
|
||||||
|
} else {
|
||||||
|
waitpid(child, 0, 0);
|
||||||
|
printf("------------------\n");
|
||||||
|
printf("Finished\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
BIN
lab02-code/fork-exec1
Executable file
BIN
lab02-code/fork-exec1
Executable file
Binary file not shown.
24
lab02-code/fork-exec1.c
Normal file
24
lab02-code/fork-exec1.c
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(void){
|
||||||
|
|
||||||
|
char *child_argv[] = {"--", "derpalerp",NULL};
|
||||||
|
char *child_cmd = "cowsay";
|
||||||
|
|
||||||
|
printf("Running command '%s'\n",child_cmd);
|
||||||
|
printf("------------------\n");
|
||||||
|
|
||||||
|
pid_t child = fork();
|
||||||
|
if (child == 0) { // child
|
||||||
|
execvp(child_cmd,child_argv);
|
||||||
|
} else {
|
||||||
|
waitpid(child, 0, 0);
|
||||||
|
printf("------------------\n");
|
||||||
|
printf("Finished\n");
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
BIN
lab02-code/fork1
Executable file
BIN
lab02-code/fork1
Executable file
Binary file not shown.
17
lab02-code/fork1.c
Normal file
17
lab02-code/fork1.c
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
pid_t child = fork();
|
||||||
|
if (child == 0) {
|
||||||
|
break;
|
||||||
|
} else { // make sure this is only executed on the parent process
|
||||||
|
waitpid(child, 0, 0); // wait for the child process to exit with status 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("I am number %d, my pid is %d\n", i, getpid());
|
||||||
|
return 0;
|
||||||
|
}
|
151
lab03-code/QUESTIONS.txt
Normal file
151
lab03-code/QUESTIONS.txt
Normal file
|
@ -0,0 +1,151 @@
|
||||||
|
__________________
|
||||||
|
|
||||||
|
LAB 03 QUESTIONS
|
||||||
|
__________________
|
||||||
|
|
||||||
|
|
||||||
|
- Name: Michael Zhang
|
||||||
|
- NetID: zhan4854
|
||||||
|
|
||||||
|
Answer the questions below according to the lab specification. Write
|
||||||
|
your answers directly in this text file and submit it to complete Lab01.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 1 `wait-fork.c'
|
||||||
|
=======================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Compile and run the program in `wait-loop.c'. Does the loop in the
|
||||||
|
program ever end? How must one "exit" the program?
|
||||||
|
|
||||||
|
The program doesn't end, since there's a while loop that continuously asks the
|
||||||
|
user for input, without any option that makes it exit. The only way to "exit"
|
||||||
|
the program is to terminate it either through sending the signal using ^C, or
|
||||||
|
else opening another terminal window and killing the process by id.
|
||||||
|
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
Alter the code so that when the child has completed execution, the
|
||||||
|
program breaks out of the loop and the program ends normally. Paste in
|
||||||
|
the code you used for this.
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
// Make sure to compile sleep_print first:
|
||||||
|
// gcc -o sleep_print sleep_print.c
|
||||||
|
char *child_argv[] = {"./sleep_print", "5", "CHILD: Awake and Done", NULL};
|
||||||
|
pid_t child_pid = fork();
|
||||||
|
if (child_pid == 0) {
|
||||||
|
execvp(child_argv[0], child_argv);
|
||||||
|
perror("errno indicates");
|
||||||
|
printf("Couldn't run '%s': is it compiled??\n", child_argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
printf("Type text then press enter to check on child:\n");
|
||||||
|
char buffer[1024];
|
||||||
|
char *input = fgets(buffer, 1024, stdin);
|
||||||
|
input[strlen(input) - 1] = '\0'; // Eliminate newline in buffer
|
||||||
|
printf("Entered text: '%s'\n", input);
|
||||||
|
|
||||||
|
printf("Waiting\n");
|
||||||
|
int status;
|
||||||
|
pid_t pid = waitpid(child_pid, &status, 0);
|
||||||
|
if (pid == child_pid) {
|
||||||
|
printf("CHILD FINISHED: ");
|
||||||
|
printf("\n");
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
printf("Child not finished: wait returned %d\n", pid);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
printf("Exiting wait-loop\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
Adjust the code so that the exit status of the child process is
|
||||||
|
printed when it finishes. Make sure to use the macros
|
||||||
|
`WIFEXITED(status)' and `WEXITSTATUS(status)' to deal with the
|
||||||
|
`status' set by `waitpid()'. Paste the code you added for your
|
||||||
|
answer.
|
||||||
|
|
||||||
|
|
||||||
|
if (WIFEXITED(status)) {
|
||||||
|
printf("CHILD FINISHED: %d", WEXITSTATUS(status));
|
||||||
|
printf("\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
D
|
||||||
|
~
|
||||||
|
|
||||||
|
Make changes so that if the user types in the string `quit', the
|
||||||
|
program exits immediately without waiting further for the
|
||||||
|
child. Example:
|
||||||
|
,----
|
||||||
|
| > a.out
|
||||||
|
| Type text then press enter to check on child:
|
||||||
|
| quit
|
||||||
|
| Entered text: 'quit'
|
||||||
|
| Quitting
|
||||||
|
| Exiting wait-loop
|
||||||
|
| > CHILD: Awake and Done
|
||||||
|
`----
|
||||||
|
Note that the child eventually prints output to the screen which is
|
||||||
|
fine.
|
||||||
|
|
||||||
|
You will need to check the user input using the `strncmp()'
|
||||||
|
function. Do some research on this function as it will prove generally
|
||||||
|
useful.
|
||||||
|
|
||||||
|
Paste the code you used below.
|
||||||
|
|
||||||
|
|
||||||
|
E
|
||||||
|
~
|
||||||
|
|
||||||
|
The current call to `waitpid()' blocks, pausing execution of the
|
||||||
|
parent process until the child finishes. Look up the option to pass to
|
||||||
|
`waitpid()' that will allow it to do a non-blocking wait which returns
|
||||||
|
immediately if the child is not finished. A sample behavior is below.
|
||||||
|
,----
|
||||||
|
| > a.out
|
||||||
|
| Type text then press enter to check on child:
|
||||||
|
| stuff
|
||||||
|
| Entered text: 'stuff'
|
||||||
|
| Waiting
|
||||||
|
| Child not finished: wait returned 0
|
||||||
|
|
|
||||||
|
| Type text then press enter to check on child:
|
||||||
|
| more stuff
|
||||||
|
| Entered text: 'more stuff'
|
||||||
|
| Waiting
|
||||||
|
| Child not finished: wait returned 0
|
||||||
|
|
|
||||||
|
| Type text then press enter to check on child:
|
||||||
|
| CHILD: Awake and Done
|
||||||
|
| Looks like you're finally up
|
||||||
|
| Entered text: 'Looks like you're finally up'
|
||||||
|
| Waiting
|
||||||
|
| CHILD FINISHED: Exit status 5
|
||||||
|
| Exiting wait-loop
|
||||||
|
| >
|
||||||
|
`----
|
||||||
|
|
||||||
|
Paste your entire code for `wait-loop.c' below.
|
BIN
lab03-code/sleep_die
Executable file
BIN
lab03-code/sleep_die
Executable file
Binary file not shown.
25
lab03-code/sleep_die.c
Normal file
25
lab03-code/sleep_die.c
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
// usage: sleep_die secs
|
||||||
|
//
|
||||||
|
// Sleep for given number of seconds then raise SIGINT which will
|
||||||
|
// cause the program to die.
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
|
||||||
|
int secs = atoi(argv[1]);
|
||||||
|
|
||||||
|
struct timespec tm = {
|
||||||
|
.tv_nsec = 0,
|
||||||
|
.tv_sec = secs,
|
||||||
|
};
|
||||||
|
nanosleep(&tm,NULL);
|
||||||
|
printf("O happy dagger! This is thy sheath;\n");
|
||||||
|
printf("there rust, and let me die.\n");
|
||||||
|
raise(SIGINT);
|
||||||
|
|
||||||
|
return secs;
|
||||||
|
}
|
||||||
|
|
BIN
lab03-code/sleep_print
Executable file
BIN
lab03-code/sleep_print
Executable file
Binary file not shown.
24
lab03-code/sleep_print.c
Normal file
24
lab03-code/sleep_print.c
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
// usage: sleep_print secs message
|
||||||
|
//
|
||||||
|
// Sleep for the given number of seconds then print the given message
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
|
||||||
|
int secs = atoi(argv[1]);
|
||||||
|
|
||||||
|
struct timespec tm = {
|
||||||
|
.tv_nsec = 0,
|
||||||
|
.tv_sec = secs,
|
||||||
|
};
|
||||||
|
nanosleep(&tm,NULL);
|
||||||
|
for(int i=2; i<argc; i++){
|
||||||
|
printf("%s ",argv[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
return secs;
|
||||||
|
}
|
||||||
|
|
BIN
lab03-code/wait-loop
Executable file
BIN
lab03-code/wait-loop
Executable file
Binary file not shown.
42
lab03-code/wait-loop.c
Normal file
42
lab03-code/wait-loop.c
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
// Make sure to compile sleep_print first:
|
||||||
|
// gcc -o sleep_print sleep_print.c
|
||||||
|
char *child_argv[] = {"./sleep_print", "5", "CHILD: Awake and Done", NULL};
|
||||||
|
pid_t child_pid = fork();
|
||||||
|
if (child_pid == 0) {
|
||||||
|
execvp(child_argv[0], child_argv);
|
||||||
|
perror("errno indicates");
|
||||||
|
printf("Couldn't run '%s': is it compiled??\n", child_argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
printf("Type text then press enter to check on child:\n");
|
||||||
|
char buffer[1024];
|
||||||
|
char *input = fgets(buffer, 1024, stdin);
|
||||||
|
input[strlen(input) - 1] = '\0'; // Eliminate newline in buffer
|
||||||
|
printf("Entered text: '%s'\n", input);
|
||||||
|
|
||||||
|
printf("Waiting\n");
|
||||||
|
int status;
|
||||||
|
pid_t pid = waitpid(child_pid, &status, 0);
|
||||||
|
if (pid == child_pid) {
|
||||||
|
if (WIFEXITED(status)) {
|
||||||
|
printf("CHILD FINISHED: %d", WEXITSTATUS(status));
|
||||||
|
printf("\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("Child not finished: wait returned %d\n", pid);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
printf("Exiting wait-loop\n");
|
||||||
|
return 0;
|
||||||
|
}
|
137
lab04-code/QUESTIONS.txt
Normal file
137
lab04-code/QUESTIONS.txt
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
__________________
|
||||||
|
|
||||||
|
LAB 04 QUESTIONS
|
||||||
|
__________________
|
||||||
|
|
||||||
|
|
||||||
|
- Name: Michael Zhang
|
||||||
|
- NetID: zhan4854
|
||||||
|
|
||||||
|
Answer the questions below according to the lab specification. Write
|
||||||
|
your answers directly in this text file and submit it to complete Lab01.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 1 `parent_listen.c'
|
||||||
|
===========================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Compile and run the program in `parent_listen.c'. Show it's output
|
||||||
|
below.
|
||||||
|
|
||||||
|
Child wrote 17 bytes
|
||||||
|
Parent read 17 bytes
|
||||||
|
Child said: 'Send $$$ please!'
|
||||||
|
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
Consider the call to pipe(). Do some research to figure out what a
|
||||||
|
pipe does and explain in a few sentences.
|
||||||
|
|
||||||
|
According to the manpage, a pipe is "a unidirectional data channel that can be
|
||||||
|
used for interprocess communication." Simply put, it's a way for processes to
|
||||||
|
communicate with each other through a file-like object, with a read end and a
|
||||||
|
write end that can be used by separate processes.
|
||||||
|
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
Observe the calls to read() and write(). Their meaning should be
|
||||||
|
self-evident (read and write data) but the parameters to these
|
||||||
|
functions are interesting. Do some reading and explain the 3
|
||||||
|
parameters to each of them. Also explain their return value.
|
||||||
|
|
||||||
|
The arguments for read and write are: int fd, void *buf, and size_t count. count
|
||||||
|
is obvious, and *buf is the buffer that the function is writing to, but the
|
||||||
|
argument of interest is fd. fd is a numerical file descriptor that can be used
|
||||||
|
to ask the kernel to make read/write transfers. File descriptors can be linked
|
||||||
|
to tty IO (stdin, stdout) or files or even sockets or pipes.
|
||||||
|
|
||||||
|
Also, the return value is simply the number of bytes that have been transferred.
|
||||||
|
|
||||||
|
|
||||||
|
D
|
||||||
|
~
|
||||||
|
|
||||||
|
If you run the program a number of times, you may see output in
|
||||||
|
different orders: the child may report writing data before the parent
|
||||||
|
has read it. Adjust the position of the wait() call to guarantee that
|
||||||
|
the order is always
|
||||||
|
- Child wrote
|
||||||
|
- Parent read
|
||||||
|
- Child said
|
||||||
|
Paste your code below.
|
||||||
|
|
||||||
|
The wait() call will guarantee that the rest of the code will not run until the
|
||||||
|
child has terminated, or, more specifically, until after the print statement has
|
||||||
|
been executed. The code does not need to be changed.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 2 `capture_stdout.c'
|
||||||
|
============================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Compile and run the program in `capture_stdout.c'. Show its output.
|
||||||
|
|
||||||
|
Process 28530 Piping
|
||||||
|
28530 Read from the my_pipe
|
||||||
|
28530 Read: '28530 In the pipe, five by five'
|
||||||
|
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
The calls `dup()' and `dup2()' are used in this program to manipulate
|
||||||
|
file descriptors. Explain the effects of the lines below.
|
||||||
|
,----
|
||||||
|
| int stdout_bak = dup(STDOUT_FILENO);
|
||||||
|
| dup2(my_pipe[PWRITE], STDOUT_FILENO);
|
||||||
|
| ...
|
||||||
|
| dup2(stdout_bak, STDOUT_FILENO);
|
||||||
|
`----
|
||||||
|
|
||||||
|
The first line makes a copy of STDOUT_FILENO and stores it into stdout_bak. The
|
||||||
|
second line changes my_pipe[PWRITE] to be the fd of STDOUT_FILENO, and finally
|
||||||
|
the last line changes STDOUT_FILENO back to the stored value that was created in
|
||||||
|
the first of the three lines.
|
||||||
|
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
The use of `printf()' normally puts output directly on the
|
||||||
|
screen. Explain why the statement
|
||||||
|
,----
|
||||||
|
| printf("%d In the pipe, five by five",
|
||||||
|
| getpid());
|
||||||
|
`----
|
||||||
|
does not print to screen as usual.
|
||||||
|
|
||||||
|
This statement does not print because by this time, the output tty STDOUT_FILENO
|
||||||
|
has had its fd changed such that it will be writing to a pipe rather than the
|
||||||
|
standard tty output.
|
||||||
|
|
||||||
|
|
||||||
|
D
|
||||||
|
~
|
||||||
|
|
||||||
|
Modify the code so that the `In the pipe...' expression is printed by
|
||||||
|
a child process.
|
||||||
|
- Add a `fork()' AFTER `dup2()' redirects standard output but before
|
||||||
|
the print
|
||||||
|
- Add an `if()' to distinguish between parent and child
|
||||||
|
- The child should print then exit
|
||||||
|
- The parent should restore stdout then read from the pipe
|
||||||
|
- Add a `wait()' to guarantee the parent waits for the child to
|
||||||
|
complete prior to reading from the pipe
|
||||||
|
Paste your completed code below
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
BIN
lab04-code/capture_stdout
Executable file
BIN
lab04-code/capture_stdout
Executable file
Binary file not shown.
44
lab04-code/capture_stdout.c
Normal file
44
lab04-code/capture_stdout.c
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
// Redirect standard output temporarily to a pipe, then restore
|
||||||
|
// standard output and retrieve the captured output
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define PREAD 0 // index of read end of pipe
|
||||||
|
#define PWRITE 1 // index of write end of pipe
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0); // Turn off I/O buffering
|
||||||
|
|
||||||
|
printf("Process %d Piping\n", getpid());
|
||||||
|
int my_pipe[2];
|
||||||
|
pipe(my_pipe);
|
||||||
|
|
||||||
|
int stdout_bak =
|
||||||
|
dup(STDOUT_FILENO); // Duplicate stdout so it can be restored later
|
||||||
|
dup2(my_pipe[PWRITE], STDOUT_FILENO); // Redirect stdout to pipe
|
||||||
|
|
||||||
|
pid_t pid = fork();
|
||||||
|
|
||||||
|
if (pid == 0) {
|
||||||
|
printf(
|
||||||
|
"%d In the pipe, five by five", // Should not show up on the screen
|
||||||
|
getpid());
|
||||||
|
close(my_pipe[PWRITE]); // Close the write end of the pipe
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
wait(NULL);
|
||||||
|
dup2(stdout_bak,
|
||||||
|
STDOUT_FILENO); // Restore stdout: redirect to backed up fd
|
||||||
|
|
||||||
|
printf("%d Read from the my_pipe\n", getpid());
|
||||||
|
char buf[2048];
|
||||||
|
int bytes_read = read(my_pipe[PREAD], buf, 2048);
|
||||||
|
|
||||||
|
buf[bytes_read] = '\0'; // Not null-terminated by default, append '\0'
|
||||||
|
close(my_pipe[PREAD]); // Close read end
|
||||||
|
printf("%d Read: '%s'\n", getpid(), buf); // Show earlier output
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
BIN
lab04-code/parent_listen
Executable file
BIN
lab04-code/parent_listen
Executable file
Binary file not shown.
55
lab04-code/parent_listen.c
Normal file
55
lab04-code/parent_listen.c
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define PREAD 0 // index of read end of pipe
|
||||||
|
#define PWRITE 1 // index of write end of pipe
|
||||||
|
#define BUFSIZE 1024
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
int par_child_pipe[2];
|
||||||
|
int pipe_result = pipe(par_child_pipe);
|
||||||
|
if(pipe_result != 0) {
|
||||||
|
perror("Failed to create pipe");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t child_pid = fork();
|
||||||
|
if(child_pid <0){
|
||||||
|
perror("Failed to fork");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHILD CODE
|
||||||
|
if(child_pid == 0){
|
||||||
|
char *msg = "Send $$$ please!";
|
||||||
|
int msg_len = strlen(msg)+1;
|
||||||
|
int bytes_written = write(par_child_pipe[PWRITE], msg, msg_len);
|
||||||
|
printf("Child wrote %d bytes\n",bytes_written);
|
||||||
|
fflush(stdout);
|
||||||
|
|
||||||
|
close(par_child_pipe[PWRITE]);
|
||||||
|
close(par_child_pipe[PREAD]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// PARENT CODE
|
||||||
|
wait(NULL);
|
||||||
|
|
||||||
|
char buffer[BUFSIZE];
|
||||||
|
// printf("Child %d started\n",child_pid);
|
||||||
|
int bytes_read = read(par_child_pipe[PREAD], buffer, BUFSIZE);
|
||||||
|
close(par_child_pipe[PWRITE]);
|
||||||
|
close(par_child_pipe[PREAD]);
|
||||||
|
|
||||||
|
printf("Parent read %d bytes\n",bytes_read);
|
||||||
|
printf("Child said: '%s'\n",buffer);
|
||||||
|
|
||||||
|
// wait(NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
139
lab05-code/3K.txt
Normal file
139
lab05-code/3K.txt
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
||||||
|
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
||||||
|
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
||||||
|
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
||||||
|
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
||||||
|
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
||||||
|
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
||||||
|
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
|
||||||
|
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
|
||||||
|
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
|
||||||
|
277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
|
||||||
|
302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
|
||||||
|
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
|
||||||
|
352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376
|
||||||
|
377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401
|
||||||
|
402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
|
||||||
|
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
|
||||||
|
452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
|
||||||
|
477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
|
||||||
|
502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526
|
||||||
|
527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551
|
||||||
|
552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576
|
||||||
|
577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
|
||||||
|
602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626
|
||||||
|
627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651
|
||||||
|
652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676
|
||||||
|
677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701
|
||||||
|
702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726
|
||||||
|
727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751
|
||||||
|
752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776
|
||||||
|
777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801
|
||||||
|
802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826
|
||||||
|
827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851
|
||||||
|
852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876
|
||||||
|
877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901
|
||||||
|
902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926
|
||||||
|
927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951
|
||||||
|
952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976
|
||||||
|
977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
|
||||||
|
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
|
||||||
|
1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
|
||||||
|
1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060
|
||||||
|
1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
|
||||||
|
1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
|
||||||
|
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120
|
||||||
|
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140
|
||||||
|
1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160
|
||||||
|
1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180
|
||||||
|
1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
|
||||||
|
1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220
|
||||||
|
1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240
|
||||||
|
1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260
|
||||||
|
1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280
|
||||||
|
1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300
|
||||||
|
1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320
|
||||||
|
1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340
|
||||||
|
1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360
|
||||||
|
1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380
|
||||||
|
1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400
|
||||||
|
1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420
|
||||||
|
1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440
|
||||||
|
1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
|
||||||
|
1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480
|
||||||
|
1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500
|
||||||
|
1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520
|
||||||
|
1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540
|
||||||
|
1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560
|
||||||
|
1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580
|
||||||
|
1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600
|
||||||
|
1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620
|
||||||
|
1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640
|
||||||
|
1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660
|
||||||
|
1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680
|
||||||
|
1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700
|
||||||
|
1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720
|
||||||
|
1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740
|
||||||
|
1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760
|
||||||
|
1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780
|
||||||
|
1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800
|
||||||
|
1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820
|
||||||
|
1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840
|
||||||
|
1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860
|
||||||
|
1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880
|
||||||
|
1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900
|
||||||
|
1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920
|
||||||
|
1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940
|
||||||
|
1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960
|
||||||
|
1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980
|
||||||
|
1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
|
||||||
|
2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020
|
||||||
|
2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040
|
||||||
|
2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060
|
||||||
|
2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080
|
||||||
|
2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100
|
||||||
|
2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120
|
||||||
|
2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140
|
||||||
|
2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160
|
||||||
|
2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180
|
||||||
|
2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200
|
||||||
|
2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220
|
||||||
|
2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240
|
||||||
|
2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260
|
||||||
|
2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280
|
||||||
|
2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300
|
||||||
|
2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320
|
||||||
|
2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340
|
||||||
|
2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360
|
||||||
|
2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380
|
||||||
|
2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400
|
||||||
|
2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420
|
||||||
|
2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440
|
||||||
|
2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460
|
||||||
|
2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480
|
||||||
|
2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500
|
||||||
|
2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520
|
||||||
|
2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540
|
||||||
|
2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560
|
||||||
|
2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580
|
||||||
|
2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600
|
||||||
|
2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620
|
||||||
|
2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640
|
||||||
|
2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660
|
||||||
|
2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680
|
||||||
|
2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700
|
||||||
|
2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720
|
||||||
|
2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740
|
||||||
|
2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760
|
||||||
|
2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780
|
||||||
|
2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800
|
||||||
|
2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820
|
||||||
|
2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840
|
||||||
|
2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860
|
||||||
|
2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880
|
||||||
|
2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900
|
||||||
|
2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920
|
||||||
|
2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940
|
||||||
|
2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960
|
||||||
|
2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980
|
||||||
|
2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000
|
237
lab05-code/4K.txt
Normal file
237
lab05-code/4K.txt
Normal file
|
@ -0,0 +1,237 @@
|
||||||
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
||||||
|
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
||||||
|
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
||||||
|
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
||||||
|
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
||||||
|
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
||||||
|
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
||||||
|
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
||||||
|
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
|
||||||
|
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
|
||||||
|
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
|
||||||
|
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
|
||||||
|
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
|
||||||
|
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
|
||||||
|
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
|
||||||
|
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
|
||||||
|
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
|
||||||
|
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
|
||||||
|
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
|
||||||
|
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
|
||||||
|
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
|
||||||
|
446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465
|
||||||
|
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
|
||||||
|
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505
|
||||||
|
506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525
|
||||||
|
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545
|
||||||
|
546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
|
||||||
|
566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
|
||||||
|
586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605
|
||||||
|
606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625
|
||||||
|
626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
|
||||||
|
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665
|
||||||
|
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685
|
||||||
|
686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
|
||||||
|
706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
|
||||||
|
726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745
|
||||||
|
746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765
|
||||||
|
766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
|
||||||
|
786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805
|
||||||
|
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
|
||||||
|
826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845
|
||||||
|
846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865
|
||||||
|
866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
|
||||||
|
886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905
|
||||||
|
906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925
|
||||||
|
926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945
|
||||||
|
946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965
|
||||||
|
966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985
|
||||||
|
986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003
|
||||||
|
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
|
||||||
|
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
|
||||||
|
1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
|
||||||
|
1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067
|
||||||
|
1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
|
||||||
|
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
|
||||||
|
1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
|
||||||
|
1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131
|
||||||
|
1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
|
||||||
|
1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163
|
||||||
|
1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179
|
||||||
|
1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195
|
||||||
|
1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211
|
||||||
|
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
|
||||||
|
1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243
|
||||||
|
1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259
|
||||||
|
1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275
|
||||||
|
1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291
|
||||||
|
1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307
|
||||||
|
1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323
|
||||||
|
1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
|
||||||
|
1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
|
||||||
|
1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371
|
||||||
|
1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387
|
||||||
|
1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403
|
||||||
|
1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
|
||||||
|
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435
|
||||||
|
1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451
|
||||||
|
1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467
|
||||||
|
1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483
|
||||||
|
1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499
|
||||||
|
1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515
|
||||||
|
1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531
|
||||||
|
1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547
|
||||||
|
1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563
|
||||||
|
1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579
|
||||||
|
1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595
|
||||||
|
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611
|
||||||
|
1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627
|
||||||
|
1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643
|
||||||
|
1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659
|
||||||
|
1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675
|
||||||
|
1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691
|
||||||
|
1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707
|
||||||
|
1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723
|
||||||
|
1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739
|
||||||
|
1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755
|
||||||
|
1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771
|
||||||
|
1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787
|
||||||
|
1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803
|
||||||
|
1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819
|
||||||
|
1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835
|
||||||
|
1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851
|
||||||
|
1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867
|
||||||
|
1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883
|
||||||
|
1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899
|
||||||
|
1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915
|
||||||
|
1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931
|
||||||
|
1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947
|
||||||
|
1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963
|
||||||
|
1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
|
||||||
|
1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995
|
||||||
|
1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011
|
||||||
|
2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027
|
||||||
|
2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043
|
||||||
|
2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059
|
||||||
|
2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075
|
||||||
|
2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091
|
||||||
|
2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107
|
||||||
|
2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123
|
||||||
|
2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139
|
||||||
|
2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155
|
||||||
|
2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171
|
||||||
|
2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187
|
||||||
|
2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203
|
||||||
|
2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219
|
||||||
|
2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235
|
||||||
|
2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251
|
||||||
|
2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267
|
||||||
|
2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283
|
||||||
|
2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299
|
||||||
|
2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315
|
||||||
|
2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331
|
||||||
|
2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347
|
||||||
|
2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363
|
||||||
|
2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379
|
||||||
|
2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395
|
||||||
|
2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411
|
||||||
|
2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427
|
||||||
|
2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443
|
||||||
|
2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459
|
||||||
|
2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475
|
||||||
|
2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491
|
||||||
|
2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507
|
||||||
|
2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523
|
||||||
|
2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539
|
||||||
|
2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555
|
||||||
|
2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571
|
||||||
|
2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587
|
||||||
|
2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603
|
||||||
|
2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619
|
||||||
|
2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635
|
||||||
|
2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651
|
||||||
|
2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667
|
||||||
|
2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683
|
||||||
|
2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699
|
||||||
|
2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715
|
||||||
|
2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731
|
||||||
|
2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747
|
||||||
|
2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763
|
||||||
|
2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779
|
||||||
|
2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795
|
||||||
|
2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811
|
||||||
|
2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827
|
||||||
|
2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843
|
||||||
|
2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859
|
||||||
|
2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875
|
||||||
|
2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891
|
||||||
|
2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907
|
||||||
|
2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923
|
||||||
|
2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939
|
||||||
|
2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955
|
||||||
|
2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971
|
||||||
|
2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987
|
||||||
|
2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003
|
||||||
|
3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019
|
||||||
|
3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035
|
||||||
|
3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051
|
||||||
|
3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067
|
||||||
|
3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083
|
||||||
|
3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099
|
||||||
|
3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115
|
||||||
|
3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131
|
||||||
|
3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147
|
||||||
|
3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163
|
||||||
|
3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179
|
||||||
|
3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195
|
||||||
|
3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211
|
||||||
|
3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227
|
||||||
|
3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243
|
||||||
|
3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259
|
||||||
|
3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275
|
||||||
|
3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291
|
||||||
|
3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307
|
||||||
|
3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323
|
||||||
|
3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339
|
||||||
|
3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355
|
||||||
|
3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371
|
||||||
|
3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387
|
||||||
|
3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403
|
||||||
|
3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419
|
||||||
|
3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435
|
||||||
|
3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451
|
||||||
|
3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467
|
||||||
|
3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483
|
||||||
|
3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499
|
||||||
|
3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515
|
||||||
|
3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531
|
||||||
|
3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547
|
||||||
|
3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563
|
||||||
|
3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579
|
||||||
|
3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595
|
||||||
|
3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611
|
||||||
|
3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627
|
||||||
|
3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643
|
||||||
|
3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659
|
||||||
|
3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675
|
||||||
|
3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691
|
||||||
|
3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707
|
||||||
|
3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723
|
||||||
|
3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739
|
||||||
|
3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755
|
||||||
|
3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771
|
||||||
|
3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787
|
||||||
|
3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803
|
||||||
|
3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819
|
||||||
|
3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835
|
||||||
|
3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851
|
||||||
|
3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867
|
||||||
|
3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883
|
||||||
|
3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899
|
||||||
|
3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915
|
||||||
|
3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931
|
||||||
|
3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947
|
||||||
|
3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963
|
||||||
|
3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979
|
||||||
|
3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995
|
||||||
|
3996 3997 3998 3999 4000
|
487
lab05-code/8K.txt
Normal file
487
lab05-code/8K.txt
Normal file
|
@ -0,0 +1,487 @@
|
||||||
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
||||||
|
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
||||||
|
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
||||||
|
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
||||||
|
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
||||||
|
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
||||||
|
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
||||||
|
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
||||||
|
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
|
||||||
|
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
|
||||||
|
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
|
||||||
|
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
|
||||||
|
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
|
||||||
|
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
|
||||||
|
306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
|
||||||
|
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
|
||||||
|
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
|
||||||
|
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
|
||||||
|
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
|
||||||
|
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
|
||||||
|
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
|
||||||
|
446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465
|
||||||
|
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
|
||||||
|
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505
|
||||||
|
506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525
|
||||||
|
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545
|
||||||
|
546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
|
||||||
|
566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
|
||||||
|
586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605
|
||||||
|
606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625
|
||||||
|
626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
|
||||||
|
646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665
|
||||||
|
666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685
|
||||||
|
686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
|
||||||
|
706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
|
||||||
|
726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745
|
||||||
|
746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765
|
||||||
|
766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
|
||||||
|
786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805
|
||||||
|
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
|
||||||
|
826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845
|
||||||
|
846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865
|
||||||
|
866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
|
||||||
|
886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905
|
||||||
|
906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925
|
||||||
|
926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945
|
||||||
|
946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965
|
||||||
|
966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985
|
||||||
|
986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003
|
||||||
|
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
|
||||||
|
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
|
||||||
|
1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
|
||||||
|
1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067
|
||||||
|
1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
|
||||||
|
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
|
||||||
|
1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
|
||||||
|
1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131
|
||||||
|
1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147
|
||||||
|
1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163
|
||||||
|
1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179
|
||||||
|
1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195
|
||||||
|
1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211
|
||||||
|
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
|
||||||
|
1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243
|
||||||
|
1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259
|
||||||
|
1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275
|
||||||
|
1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291
|
||||||
|
1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307
|
||||||
|
1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323
|
||||||
|
1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
|
||||||
|
1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
|
||||||
|
1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371
|
||||||
|
1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387
|
||||||
|
1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403
|
||||||
|
1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
|
||||||
|
1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435
|
||||||
|
1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451
|
||||||
|
1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467
|
||||||
|
1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483
|
||||||
|
1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499
|
||||||
|
1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515
|
||||||
|
1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531
|
||||||
|
1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547
|
||||||
|
1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563
|
||||||
|
1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579
|
||||||
|
1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595
|
||||||
|
1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611
|
||||||
|
1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627
|
||||||
|
1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643
|
||||||
|
1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659
|
||||||
|
1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675
|
||||||
|
1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691
|
||||||
|
1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707
|
||||||
|
1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723
|
||||||
|
1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739
|
||||||
|
1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755
|
||||||
|
1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771
|
||||||
|
1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787
|
||||||
|
1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803
|
||||||
|
1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819
|
||||||
|
1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835
|
||||||
|
1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851
|
||||||
|
1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867
|
||||||
|
1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883
|
||||||
|
1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899
|
||||||
|
1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915
|
||||||
|
1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931
|
||||||
|
1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947
|
||||||
|
1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963
|
||||||
|
1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
|
||||||
|
1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995
|
||||||
|
1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011
|
||||||
|
2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027
|
||||||
|
2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043
|
||||||
|
2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059
|
||||||
|
2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075
|
||||||
|
2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091
|
||||||
|
2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107
|
||||||
|
2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123
|
||||||
|
2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139
|
||||||
|
2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155
|
||||||
|
2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171
|
||||||
|
2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187
|
||||||
|
2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203
|
||||||
|
2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219
|
||||||
|
2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235
|
||||||
|
2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251
|
||||||
|
2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267
|
||||||
|
2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283
|
||||||
|
2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299
|
||||||
|
2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315
|
||||||
|
2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331
|
||||||
|
2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347
|
||||||
|
2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363
|
||||||
|
2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379
|
||||||
|
2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395
|
||||||
|
2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411
|
||||||
|
2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427
|
||||||
|
2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443
|
||||||
|
2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459
|
||||||
|
2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475
|
||||||
|
2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491
|
||||||
|
2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507
|
||||||
|
2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523
|
||||||
|
2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539
|
||||||
|
2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555
|
||||||
|
2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571
|
||||||
|
2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587
|
||||||
|
2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603
|
||||||
|
2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619
|
||||||
|
2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635
|
||||||
|
2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651
|
||||||
|
2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667
|
||||||
|
2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683
|
||||||
|
2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699
|
||||||
|
2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715
|
||||||
|
2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731
|
||||||
|
2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747
|
||||||
|
2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763
|
||||||
|
2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779
|
||||||
|
2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795
|
||||||
|
2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811
|
||||||
|
2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827
|
||||||
|
2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843
|
||||||
|
2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859
|
||||||
|
2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875
|
||||||
|
2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891
|
||||||
|
2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907
|
||||||
|
2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923
|
||||||
|
2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939
|
||||||
|
2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955
|
||||||
|
2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971
|
||||||
|
2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987
|
||||||
|
2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003
|
||||||
|
3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019
|
||||||
|
3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035
|
||||||
|
3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051
|
||||||
|
3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067
|
||||||
|
3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083
|
||||||
|
3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099
|
||||||
|
3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115
|
||||||
|
3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131
|
||||||
|
3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147
|
||||||
|
3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163
|
||||||
|
3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179
|
||||||
|
3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195
|
||||||
|
3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211
|
||||||
|
3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227
|
||||||
|
3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243
|
||||||
|
3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259
|
||||||
|
3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275
|
||||||
|
3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291
|
||||||
|
3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307
|
||||||
|
3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323
|
||||||
|
3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339
|
||||||
|
3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355
|
||||||
|
3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371
|
||||||
|
3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387
|
||||||
|
3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403
|
||||||
|
3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419
|
||||||
|
3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435
|
||||||
|
3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451
|
||||||
|
3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467
|
||||||
|
3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483
|
||||||
|
3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499
|
||||||
|
3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515
|
||||||
|
3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531
|
||||||
|
3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547
|
||||||
|
3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563
|
||||||
|
3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579
|
||||||
|
3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595
|
||||||
|
3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611
|
||||||
|
3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627
|
||||||
|
3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643
|
||||||
|
3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659
|
||||||
|
3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675
|
||||||
|
3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691
|
||||||
|
3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707
|
||||||
|
3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723
|
||||||
|
3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739
|
||||||
|
3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755
|
||||||
|
3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771
|
||||||
|
3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787
|
||||||
|
3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803
|
||||||
|
3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819
|
||||||
|
3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835
|
||||||
|
3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851
|
||||||
|
3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867
|
||||||
|
3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883
|
||||||
|
3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899
|
||||||
|
3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915
|
||||||
|
3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931
|
||||||
|
3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947
|
||||||
|
3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963
|
||||||
|
3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979
|
||||||
|
3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995
|
||||||
|
3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011
|
||||||
|
4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027
|
||||||
|
4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043
|
||||||
|
4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059
|
||||||
|
4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075
|
||||||
|
4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091
|
||||||
|
4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107
|
||||||
|
4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123
|
||||||
|
4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139
|
||||||
|
4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155
|
||||||
|
4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171
|
||||||
|
4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187
|
||||||
|
4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203
|
||||||
|
4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219
|
||||||
|
4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235
|
||||||
|
4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251
|
||||||
|
4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267
|
||||||
|
4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283
|
||||||
|
4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299
|
||||||
|
4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315
|
||||||
|
4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331
|
||||||
|
4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347
|
||||||
|
4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363
|
||||||
|
4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379
|
||||||
|
4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395
|
||||||
|
4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411
|
||||||
|
4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427
|
||||||
|
4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443
|
||||||
|
4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459
|
||||||
|
4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475
|
||||||
|
4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491
|
||||||
|
4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507
|
||||||
|
4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523
|
||||||
|
4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539
|
||||||
|
4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555
|
||||||
|
4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571
|
||||||
|
4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587
|
||||||
|
4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603
|
||||||
|
4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619
|
||||||
|
4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635
|
||||||
|
4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651
|
||||||
|
4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667
|
||||||
|
4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683
|
||||||
|
4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699
|
||||||
|
4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715
|
||||||
|
4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731
|
||||||
|
4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747
|
||||||
|
4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763
|
||||||
|
4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779
|
||||||
|
4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795
|
||||||
|
4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811
|
||||||
|
4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827
|
||||||
|
4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843
|
||||||
|
4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859
|
||||||
|
4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875
|
||||||
|
4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891
|
||||||
|
4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907
|
||||||
|
4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923
|
||||||
|
4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939
|
||||||
|
4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955
|
||||||
|
4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971
|
||||||
|
4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987
|
||||||
|
4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003
|
||||||
|
5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019
|
||||||
|
5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035
|
||||||
|
5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051
|
||||||
|
5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067
|
||||||
|
5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083
|
||||||
|
5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099
|
||||||
|
5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115
|
||||||
|
5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131
|
||||||
|
5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147
|
||||||
|
5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163
|
||||||
|
5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179
|
||||||
|
5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195
|
||||||
|
5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211
|
||||||
|
5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227
|
||||||
|
5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243
|
||||||
|
5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259
|
||||||
|
5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275
|
||||||
|
5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291
|
||||||
|
5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307
|
||||||
|
5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323
|
||||||
|
5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339
|
||||||
|
5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355
|
||||||
|
5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371
|
||||||
|
5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387
|
||||||
|
5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403
|
||||||
|
5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419
|
||||||
|
5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435
|
||||||
|
5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451
|
||||||
|
5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467
|
||||||
|
5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483
|
||||||
|
5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499
|
||||||
|
5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515
|
||||||
|
5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531
|
||||||
|
5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547
|
||||||
|
5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563
|
||||||
|
5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579
|
||||||
|
5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595
|
||||||
|
5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611
|
||||||
|
5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627
|
||||||
|
5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643
|
||||||
|
5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659
|
||||||
|
5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675
|
||||||
|
5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691
|
||||||
|
5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707
|
||||||
|
5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723
|
||||||
|
5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739
|
||||||
|
5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755
|
||||||
|
5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771
|
||||||
|
5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787
|
||||||
|
5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803
|
||||||
|
5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819
|
||||||
|
5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835
|
||||||
|
5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851
|
||||||
|
5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867
|
||||||
|
5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883
|
||||||
|
5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899
|
||||||
|
5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915
|
||||||
|
5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931
|
||||||
|
5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947
|
||||||
|
5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963
|
||||||
|
5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979
|
||||||
|
5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995
|
||||||
|
5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011
|
||||||
|
6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027
|
||||||
|
6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043
|
||||||
|
6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059
|
||||||
|
6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075
|
||||||
|
6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091
|
||||||
|
6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107
|
||||||
|
6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123
|
||||||
|
6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139
|
||||||
|
6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155
|
||||||
|
6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171
|
||||||
|
6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187
|
||||||
|
6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203
|
||||||
|
6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219
|
||||||
|
6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235
|
||||||
|
6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251
|
||||||
|
6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267
|
||||||
|
6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283
|
||||||
|
6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299
|
||||||
|
6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315
|
||||||
|
6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331
|
||||||
|
6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347
|
||||||
|
6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363
|
||||||
|
6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379
|
||||||
|
6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395
|
||||||
|
6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411
|
||||||
|
6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427
|
||||||
|
6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443
|
||||||
|
6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459
|
||||||
|
6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475
|
||||||
|
6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491
|
||||||
|
6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507
|
||||||
|
6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523
|
||||||
|
6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539
|
||||||
|
6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555
|
||||||
|
6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571
|
||||||
|
6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587
|
||||||
|
6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603
|
||||||
|
6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619
|
||||||
|
6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635
|
||||||
|
6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651
|
||||||
|
6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667
|
||||||
|
6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683
|
||||||
|
6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699
|
||||||
|
6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715
|
||||||
|
6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731
|
||||||
|
6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747
|
||||||
|
6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763
|
||||||
|
6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779
|
||||||
|
6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795
|
||||||
|
6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811
|
||||||
|
6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827
|
||||||
|
6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843
|
||||||
|
6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859
|
||||||
|
6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875
|
||||||
|
6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891
|
||||||
|
6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907
|
||||||
|
6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923
|
||||||
|
6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939
|
||||||
|
6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955
|
||||||
|
6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971
|
||||||
|
6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987
|
||||||
|
6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003
|
||||||
|
7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019
|
||||||
|
7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035
|
||||||
|
7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051
|
||||||
|
7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067
|
||||||
|
7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083
|
||||||
|
7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099
|
||||||
|
7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115
|
||||||
|
7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131
|
||||||
|
7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147
|
||||||
|
7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163
|
||||||
|
7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179
|
||||||
|
7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195
|
||||||
|
7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211
|
||||||
|
7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227
|
||||||
|
7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243
|
||||||
|
7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259
|
||||||
|
7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275
|
||||||
|
7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291
|
||||||
|
7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307
|
||||||
|
7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323
|
||||||
|
7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339
|
||||||
|
7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355
|
||||||
|
7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371
|
||||||
|
7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387
|
||||||
|
7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403
|
||||||
|
7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419
|
||||||
|
7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435
|
||||||
|
7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451
|
||||||
|
7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467
|
||||||
|
7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483
|
||||||
|
7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499
|
||||||
|
7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515
|
||||||
|
7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531
|
||||||
|
7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547
|
||||||
|
7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563
|
||||||
|
7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579
|
||||||
|
7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595
|
||||||
|
7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611
|
||||||
|
7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627
|
||||||
|
7628 7629 7630 7631 7632 7633 7634 7635 7636 7637 7638 7639 7640 7641 7642 7643
|
||||||
|
7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659
|
||||||
|
7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675
|
||||||
|
7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691
|
||||||
|
7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707
|
||||||
|
7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723
|
||||||
|
7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739
|
||||||
|
7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755
|
||||||
|
7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771
|
||||||
|
7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787
|
||||||
|
7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803
|
||||||
|
7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819
|
||||||
|
7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835
|
||||||
|
7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851
|
||||||
|
7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867
|
||||||
|
7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883
|
||||||
|
7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899
|
||||||
|
7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 7912 7913 7914 7915
|
||||||
|
7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931
|
||||||
|
7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947
|
||||||
|
7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963
|
||||||
|
7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979
|
||||||
|
7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995
|
||||||
|
7996 7997 7998 7999 8000
|
103
lab05-code/QUESTIONS.txt
Normal file
103
lab05-code/QUESTIONS.txt
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
__________________
|
||||||
|
|
||||||
|
LAB 05 QUESTIONS
|
||||||
|
__________________
|
||||||
|
|
||||||
|
|
||||||
|
- Name: Michael Zhang
|
||||||
|
- NetID: zhan4854
|
||||||
|
|
||||||
|
Answer the questions below according to the lab specification. Write
|
||||||
|
your answers directly in this text file and submit it to complete Lab01.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 1 `dirops.c'
|
||||||
|
====================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Examine the source code of `dirops.c' closely. It makes use of a
|
||||||
|
variety of system calls to produce a semi-interesting effect. Compile
|
||||||
|
and run it several times. Describe the overall intent of the program
|
||||||
|
based on its output and the code you understand.
|
||||||
|
|
||||||
|
It lists the files in the current directory, their files sizes, determines the
|
||||||
|
largest file in the directory, and then copies that to a new file
|
||||||
|
"<filename>.copy". An observation I made was that the directories . and .. are
|
||||||
|
fixed at 4096 bytes.
|
||||||
|
|
||||||
|
B ~
|
||||||
|
|
||||||
|
What set of system calls is used by the program to determine all the
|
||||||
|
files in the current directory? Describe briefly how these calls work
|
||||||
|
together.
|
||||||
|
|
||||||
|
readdir returns the next entry in the directory listing.
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
Identify the system call that `dirops.c' uses to find the sizes of
|
||||||
|
files. Describe briefly how this call works.
|
||||||
|
|
||||||
|
This line: stat(file->d_name, &sb); retrieves information from the operating
|
||||||
|
system about how the file is stored on the disk, including inode numbers,
|
||||||
|
ownership, file size, and so on.
|
||||||
|
|
||||||
|
D
|
||||||
|
~
|
||||||
|
|
||||||
|
The following line sets up the read/write permissions that the copied
|
||||||
|
file will have.
|
||||||
|
,----
|
||||||
|
| mode_t perms = S_IRUSR | S_IWUSR;
|
||||||
|
`----
|
||||||
|
Modify this line so that the copied file is readable by the group as
|
||||||
|
well as the user.
|
||||||
|
|
||||||
|
/Optional challenge:/ Set the permissions to be identical to the
|
||||||
|
original file. `stat()' is one way to find out the permissions for the
|
||||||
|
original file.
|
||||||
|
|
||||||
|
I found the list of user permissions in the 'stat' manpage: S_IRGRP. The
|
||||||
|
modified line looks like:
|
||||||
|
|
||||||
|
mode_t perms = S_IRUSR | S_IWUSR | S_IRGRP;
|
||||||
|
|
||||||
|
In order to find out what the original permissions were, another stat call must
|
||||||
|
be performed on the file with the largest size. Ideally, this should be done by
|
||||||
|
file descriptor, but since we are traversing the directory, it's impractical to
|
||||||
|
keep all the file descriptors open until we identify the largest file. Here's
|
||||||
|
how I would do it:
|
||||||
|
|
||||||
|
struct stat s;
|
||||||
|
stat(max_name, &s);
|
||||||
|
mode_t perms = s.st_mode;
|
||||||
|
|
||||||
|
E
|
||||||
|
~
|
||||||
|
|
||||||
|
`dirops.c' contains a subtle bug in the following bit of code towards
|
||||||
|
the end of the file.
|
||||||
|
,----
|
||||||
|
| while( (nbytes = read(infd, buf, BUFSIZE)) > 0){
|
||||||
|
| write(outfd, buf, BUFSIZE);
|
||||||
|
| }
|
||||||
|
`----
|
||||||
|
You should observe that every time program is run, it will identify a
|
||||||
|
copied file as the largest and make another copy due to this bug. It
|
||||||
|
may help to examine the ends of the copied files with the `tail
|
||||||
|
file.txt.copy' command which will show the last 10 lines.
|
||||||
|
|
||||||
|
Explain what is wrong with the loop and paste a fixed version below.
|
||||||
|
|
||||||
|
The problem is that the buffer is full before the final loop, which may be less
|
||||||
|
than BUFSIZE bytes, but the write command is still writing BUFSIZE bytes. Sicne
|
||||||
|
there's no mechanism to automatically clear out the remaining bytes, they get
|
||||||
|
written to the file as well. The solution is to only write the number of bytes
|
||||||
|
that have been read, since it was stored anyways but not used.
|
||||||
|
|
||||||
|
44 while ((nbytes = read(infd, buf, BUFSIZE)) > 0) {
|
||||||
|
45 write(outfd, buf, nbytes);
|
||||||
|
46 }
|
BIN
lab05-code/dirops
Executable file
BIN
lab05-code/dirops
Executable file
Binary file not shown.
53
lab05-code/dirops.backup.c
Normal file
53
lab05-code/dirops.backup.c
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/sysmacros.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define NAMELEN 2048
|
||||||
|
#define BUFSIZE 1024
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
long long max_size = 0;
|
||||||
|
char max_name[NAMELEN] = {};
|
||||||
|
|
||||||
|
DIR *dir = opendir(".");
|
||||||
|
struct dirent *file = NULL;
|
||||||
|
while( (file = readdir(dir)) != NULL){
|
||||||
|
struct stat sb;
|
||||||
|
stat(file->d_name, &sb);
|
||||||
|
printf("%-30s : %lld bytes\n",
|
||||||
|
file->d_name, (long long) sb.st_size);
|
||||||
|
if(sb.st_size > max_size){
|
||||||
|
max_size = sb.st_size;
|
||||||
|
strncpy(max_name, file->d_name, NAMELEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
|
||||||
|
printf("Largest file: %s with %lld bytes\n",
|
||||||
|
max_name, max_size);
|
||||||
|
|
||||||
|
char copy_name[NAMELEN];
|
||||||
|
snprintf(copy_name, NAMELEN, "%s.copy", max_name);
|
||||||
|
printf("Copying %s to %s\n",max_name,copy_name);
|
||||||
|
|
||||||
|
char buf[BUFSIZE];
|
||||||
|
int infd = open(max_name, O_RDONLY);
|
||||||
|
int flags = O_WRONLY | O_CREAT | O_TRUNC;
|
||||||
|
mode_t perms = S_IRUSR | S_IWUSR;
|
||||||
|
int outfd = open(copy_name, flags, perms);
|
||||||
|
int nbytes;
|
||||||
|
while( (nbytes = read(infd, buf, BUFSIZE)) > 0){
|
||||||
|
write(outfd, buf, BUFSIZE);
|
||||||
|
}
|
||||||
|
printf("Copy complete\n");
|
||||||
|
close(infd);
|
||||||
|
close(outfd);
|
||||||
|
return 0;
|
||||||
|
}
|
51
lab05-code/dirops.c
Normal file
51
lab05-code/dirops.c
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/sysmacros.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define NAMELEN 2048
|
||||||
|
#define BUFSIZE 1024
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
long long max_size = 0;
|
||||||
|
char max_name[NAMELEN] = {};
|
||||||
|
|
||||||
|
DIR *dir = opendir(".");
|
||||||
|
struct dirent *file = NULL;
|
||||||
|
while ((file = readdir(dir)) != NULL) {
|
||||||
|
struct stat sb;
|
||||||
|
stat(file->d_name, &sb);
|
||||||
|
printf("%-30s : %lld bytes\n", file->d_name, (long long)sb.st_size);
|
||||||
|
if (sb.st_size > max_size) {
|
||||||
|
max_size = sb.st_size;
|
||||||
|
strncpy(max_name, file->d_name, NAMELEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
|
||||||
|
printf("Largest file: %s with %lld bytes\n", max_name, max_size);
|
||||||
|
|
||||||
|
char copy_name[NAMELEN];
|
||||||
|
snprintf(copy_name, NAMELEN, "%s.copy", max_name);
|
||||||
|
printf("Copying %s to %s\n", max_name, copy_name);
|
||||||
|
|
||||||
|
char buf[BUFSIZE];
|
||||||
|
int infd = open(max_name, O_RDONLY);
|
||||||
|
int flags = O_WRONLY | O_CREAT | O_TRUNC;
|
||||||
|
mode_t perms = S_IRUSR | S_IWUSR;
|
||||||
|
int outfd = open(copy_name, flags, perms);
|
||||||
|
int nbytes;
|
||||||
|
while ((nbytes = read(infd, buf, BUFSIZE)) > 0) {
|
||||||
|
write(outfd, buf, nbytes);
|
||||||
|
}
|
||||||
|
printf("Copy complete\n");
|
||||||
|
close(infd);
|
||||||
|
close(outfd);
|
||||||
|
return 0;
|
||||||
|
}
|
198
lab06-code/QUESTIONS.txt
Normal file
198
lab06-code/QUESTIONS.txt
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
_________________
|
||||||
|
|
||||||
|
LAB 06 QUESTIONS
|
||||||
|
__________________
|
||||||
|
|
||||||
|
|
||||||
|
- Name: Michael Zhang
|
||||||
|
- NetID: zhan4854
|
||||||
|
|
||||||
|
Answer the questions below according to the lab specification. Write
|
||||||
|
your answers directly in this text file and submit it to complete Lab01.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 1 `birth_death.c'
|
||||||
|
=========================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Compile `circle_of_life.c' to the program `circle_of_life' and run
|
||||||
|
it. Examine the results and feel free to terminate execution
|
||||||
|
early. Examine the source code if desired though it is merely a
|
||||||
|
print/sleep loop.
|
||||||
|
|
||||||
|
Compile `birth_death.c' to the program `birth_death'. This program is
|
||||||
|
invoked with two arguments, another program name and a "lifetime"
|
||||||
|
which is an integer number of seconds. Run it like
|
||||||
|
,----
|
||||||
|
| $> ./birth_death ./circle_of_life 4
|
||||||
|
`----
|
||||||
|
and show the output below.
|
||||||
|
|
||||||
|
Nants ingonyama bagithi baba
|
||||||
|
Sithi uhm ingonyama
|
||||||
|
Nants ingonyama bagithi baba
|
||||||
|
Sithi uhm ingonyama
|
||||||
|
kill result: 0
|
||||||
|
child process 13697 terminated with signal 2
|
||||||
|
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
Examine the source code for `birth_death.c' and determine the system
|
||||||
|
call the parent program (`birth_death') uses to send signals to the
|
||||||
|
child program. Paste this line below and explain which signal is being
|
||||||
|
sent.
|
||||||
|
|
||||||
|
int result = kill(pid,SIGINT)
|
||||||
|
|
||||||
|
This line invokes the kill system call and tells the child to kill itself.
|
||||||
|
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
`birth_death.c' waits for a child to finish then outputs what signal
|
||||||
|
caused it to be terminated if that was the cause of death. Paste the
|
||||||
|
lines of code which determine if a child was terminated due to a
|
||||||
|
signal below and mention the macros used for this purpose.
|
||||||
|
|
||||||
|
32 if(WIFSIGNALED(status)){ // check if a signal ended the child
|
||||||
|
33 printf("child process %d terminated with signal %d\n",
|
||||||
|
34 pid,WTERMSIG(status));
|
||||||
|
35 }
|
||||||
|
|
||||||
|
Macros used were WIFSIGNALED to check if the child was terminated by a signal,
|
||||||
|
and WTERMSIG which retruns the actual signal.
|
||||||
|
|
||||||
|
|
||||||
|
D
|
||||||
|
~
|
||||||
|
|
||||||
|
Compile the program `no_interruptions.c' and run it with
|
||||||
|
`birth_death'. Show your results below.
|
||||||
|
|
||||||
|
Note that you may need to send signals to `no_interruptions' to
|
||||||
|
forcibly end it. The `pkill' command is useful for this as in
|
||||||
|
,----
|
||||||
|
| pkill no_inter # send TERM signal to proc name matching "no_inter"
|
||||||
|
| pkill -KILL no_inter # send KILL signal to proc name matching "no_inter"
|
||||||
|
`----
|
||||||
|
|
||||||
|
Ma-na na-na!
|
||||||
|
Ma-na na-na!
|
||||||
|
Ma-na na-na!
|
||||||
|
Ma-na na-na!
|
||||||
|
|
||||||
|
kill result: 0
|
||||||
|
No SIGINT-erruptions allowed.
|
||||||
|
Ma-na na-na!
|
||||||
|
Ma-na na-na!
|
||||||
|
Ma-na na-na!
|
||||||
|
Ma-na na-na!
|
||||||
|
|
||||||
|
Try to SIGTERM me? Piss off!
|
||||||
|
Ma-na na-na!
|
||||||
|
Ma-na na-na!
|
||||||
|
Ma-na na-na!
|
||||||
|
|
||||||
|
|
||||||
|
E
|
||||||
|
~
|
||||||
|
|
||||||
|
Examine the `no_interruptions.c' code and describe how it is able to
|
||||||
|
avoid being killed when receiving the interrupt and TERM signals. Show
|
||||||
|
the lines of code used to accomplish this signal handling.
|
||||||
|
|
||||||
|
It uses signal handlers to catch the signals and handle them by not terminating
|
||||||
|
itself, contrary to what the signal is telling it to do. The only signal it
|
||||||
|
can't avoid is SIGKILL (and SIGSTOP but not used here) which forcefully
|
||||||
|
terminates it.
|
||||||
|
|
||||||
|
28 // Set handling functions for programs
|
||||||
|
29 signal(SIGINT, handle_SIGINT);
|
||||||
|
30 signal(SIGTERM, handle_SIGTERM);
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 2 `start_stop.c'
|
||||||
|
========================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Compile `start_stop.c' to the program `start_stop'. This program is
|
||||||
|
invoked identically to `birth_death' with two arguments, another
|
||||||
|
program name and an "interval" which is an integer number of
|
||||||
|
seconds. Run it like
|
||||||
|
,----
|
||||||
|
| $> ./start_stop ./circle_of_life 3
|
||||||
|
`----
|
||||||
|
and show the output below. You may terminate the program early once
|
||||||
|
you see the pattern.
|
||||||
|
|
||||||
|
Nants ingonyama bagithi baba
|
||||||
|
Sithi uhm ingonyama
|
||||||
|
Nants ingonyama bagithi baba
|
||||||
|
SIGSTOP result: 0
|
||||||
|
SIGCONT result: 0
|
||||||
|
Sithi uhm ingonyama
|
||||||
|
Ingonyama
|
||||||
|
Siyo Nqoba
|
||||||
|
SIGSTOP result: 0
|
||||||
|
SIGCONT result: 0
|
||||||
|
Ingonyama Ingonyama nengw' enamabala
|
||||||
|
From the day we arrive on the planet
|
||||||
|
And blinking, step into the Sun
|
||||||
|
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
Describe at a high level the effect that `start_stop' has on a child
|
||||||
|
process it runs
|
||||||
|
|
||||||
|
start_stop pauses and resumes the execution of the child process periodically
|
||||||
|
(more precisely, based on the interval passed through the next argument), so in
|
||||||
|
this case, it would let the child run for 3 seconds, then pause for 3 seconds,
|
||||||
|
and then resume the loop until the child finished executing.
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
Examine the source code of `start_stop.c' and determine the types of
|
||||||
|
signals it uses to alter behavior of its child process and paste the
|
||||||
|
corresponding lines of code below.
|
||||||
|
|
||||||
|
It uses the SIGSTOP signall with kill(), which stops the program that's
|
||||||
|
executing but its behavior is more like pause. It resumes execution with SIGCONT
|
||||||
|
afterwards. The relevant lines of code are:
|
||||||
|
|
||||||
|
25 result = kill(pid,SIGSTOP);
|
||||||
|
28 result = kill(pid,SIGCONT);
|
||||||
|
|
||||||
|
D
|
||||||
|
~
|
||||||
|
|
||||||
|
The program `no_interruptions.c' establishes signal handlers for some
|
||||||
|
signals allowing it to ignore signals that would normally terminate a
|
||||||
|
process. Investigate whether it is possible to similarly ignore the
|
||||||
|
signal used by `start_stop' to pause its child process. Hint: Consider
|
||||||
|
the provided program `cant_catch_sigstop.c' and run it with
|
||||||
|
`start_stop'.
|
||||||
|
|
||||||
|
According to the manpage for SIGNAL(2), SIGSTOP cannot be caught by the program:
|
||||||
|
|
||||||
|
The signals SIGKILL and SIGSTOP cannot be caught or ignored.
|
||||||
|
|
||||||
|
As expected, the output of cant_catch_sigstop is:
|
||||||
|
|
||||||
|
I'm awake, I'm awake!
|
||||||
|
I'm awake, I'm awake!
|
||||||
|
SIGSTOP result: 0
|
||||||
|
SIGCONT result: 0
|
||||||
|
I'm awake, I'm awake!
|
||||||
|
I'm awake, I'm awake!
|
||||||
|
|
||||||
|
and the signal has not been caught.
|
BIN
lab06-code/birth_death
Executable file
BIN
lab06-code/birth_death
Executable file
Binary file not shown.
38
lab06-code/birth_death.c
Normal file
38
lab06-code/birth_death.c
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
if(argc < 3){
|
||||||
|
printf("usage: %s <program> <int>\n",argv[0]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
char *child_prog = argv[1]; // program to run as a child
|
||||||
|
int lifetime = atoi(argv[2]); // time to wait to end child
|
||||||
|
|
||||||
|
int pid = fork(); // fork execution
|
||||||
|
|
||||||
|
if(pid == 0){ // CHILD
|
||||||
|
execlp(child_prog, child_prog, NULL); // execute specified program
|
||||||
|
}
|
||||||
|
|
||||||
|
int status, ret; // PARENT
|
||||||
|
while(1){ // Loop until child done
|
||||||
|
sleep(lifetime); // sleep for given "lifetime" of child
|
||||||
|
ret = waitpid(pid, &status, WNOHANG); // check on child
|
||||||
|
if(ret == pid){ // if child is finished
|
||||||
|
break; // break from loop
|
||||||
|
}
|
||||||
|
int result = kill(pid,SIGINT); // send a interrupt signal to child
|
||||||
|
printf("kill result: %d\n",result); // check on delivery
|
||||||
|
}
|
||||||
|
|
||||||
|
if(WIFSIGNALED(status)){ // check if a signal ended the child
|
||||||
|
printf("child process %d terminated with signal %d\n",
|
||||||
|
pid,WTERMSIG(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
BIN
lab06-code/cant_catch_sigstop
Executable file
BIN
lab06-code/cant_catch_sigstop
Executable file
Binary file not shown.
30
lab06-code/cant_catch_sigstop.c
Normal file
30
lab06-code/cant_catch_sigstop.c
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
// A C program that does not terminate from an interrupt signal.
|
||||||
|
// Usually pressing Ctrl-C sends this to the foreground program.
|
||||||
|
//
|
||||||
|
// To stop this program from running, open another terminal and try
|
||||||
|
// > pkill -9 a.out
|
||||||
|
// assuming you named the output program a.out
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
// Function run when a SIGINT is sent to the program
|
||||||
|
void handle_SIGSTOP(int sig_num) {
|
||||||
|
// Reset handler to catch SIGINT next time.
|
||||||
|
signal(SIGSTOP, handle_SIGSTOP);
|
||||||
|
printf("\nThere's no SIGSTOPping me!\n");
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
// Set handling functions for programs
|
||||||
|
signal(SIGSTOP, handle_SIGSTOP);
|
||||||
|
|
||||||
|
/* Infinite loop */
|
||||||
|
while (1) {
|
||||||
|
sleep(1);
|
||||||
|
printf("I'm awake, I'm awake!\n");
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
BIN
lab06-code/circle_of_life
Executable file
BIN
lab06-code/circle_of_life
Executable file
Binary file not shown.
50
lab06-code/circle_of_life.c
Normal file
50
lab06-code/circle_of_life.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
// https://genius.com/Walt-disney-records-circle-of-life-lyrics
|
||||||
|
char *lyrics[] = {
|
||||||
|
"Nants ingonyama bagithi baba",
|
||||||
|
"Sithi uhm ingonyama",
|
||||||
|
"Nants ingonyama bagithi baba",
|
||||||
|
"Sithi uhm ingonyama",
|
||||||
|
"Ingonyama",
|
||||||
|
"Siyo Nqoba",
|
||||||
|
"Ingonyama Ingonyama nengw' enamabala ",
|
||||||
|
"From the day we arrive on the planet",
|
||||||
|
"And blinking, step into the Sun",
|
||||||
|
"There's more to be seen than can ever be seen",
|
||||||
|
"More to do than can ever be done",
|
||||||
|
"Some say eat or be eaten",
|
||||||
|
"Some say live and let live",
|
||||||
|
"But all are agreed as they join the stampede",
|
||||||
|
"You should never take more than you give",
|
||||||
|
"In the circle of life",
|
||||||
|
"It's the wheel of fortune",
|
||||||
|
"It's the leap of faith",
|
||||||
|
"It's the band of hope",
|
||||||
|
"Till we find our place",
|
||||||
|
"On the path unwinding",
|
||||||
|
"In the circle, the circle of life",
|
||||||
|
"Some of us fall by the wayside",
|
||||||
|
"And some of us soar to the stars",
|
||||||
|
"And some of us sail through our troubles",
|
||||||
|
"And some have to live with the scars",
|
||||||
|
"There's far too much to take in here",
|
||||||
|
"More to find than can ever be found",
|
||||||
|
"But the Sun rolling high through the sapphire sky",
|
||||||
|
"Keeps great and small on the endless round",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
int index = 0;
|
||||||
|
while(lyrics[index] != NULL){
|
||||||
|
printf("%s\n",lyrics[index]);
|
||||||
|
fflush(stdout);
|
||||||
|
index++;
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
}
|
BIN
lab06-code/no_interruptions
Executable file
BIN
lab06-code/no_interruptions
Executable file
Binary file not shown.
39
lab06-code/no_interruptions.c
Normal file
39
lab06-code/no_interruptions.c
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
// A C program that does not terminate from an interrupt signal.
|
||||||
|
// Usually pressing Ctrl-C sends this to the foreground program.
|
||||||
|
//
|
||||||
|
// To stop this program from running, open another terminal and try
|
||||||
|
// > pkill -9 a.out
|
||||||
|
// assuming you named the output program a.out
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
// Function run when a SIGINT is sent to the program
|
||||||
|
void handle_SIGINT(int sig_num) {
|
||||||
|
// Reset handler to catch SIGINT next time.
|
||||||
|
signal(SIGINT, handle_SIGINT);
|
||||||
|
printf("\nNo SIGINT-erruptions allowed.\n");
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function run when a SIGTERM is sent to the program
|
||||||
|
void handle_SIGTERM(int sig_num) {
|
||||||
|
// Reset handler to catch SIGTERM next time.
|
||||||
|
signal(SIGTERM, handle_SIGTERM);
|
||||||
|
printf("\nTry to SIGTERM me? Piss off!\n");
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main () {
|
||||||
|
// Set handling functions for programs
|
||||||
|
signal(SIGINT, handle_SIGINT);
|
||||||
|
signal(SIGTERM, handle_SIGTERM);
|
||||||
|
|
||||||
|
/* Infinite loop */
|
||||||
|
while(1) {
|
||||||
|
sleep(1);
|
||||||
|
printf("Ma-na na-na!\n");
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
BIN
lab06-code/start_stop
Executable file
BIN
lab06-code/start_stop
Executable file
Binary file not shown.
43
lab06-code/start_stop.c
Normal file
43
lab06-code/start_stop.c
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
if(argc < 3){
|
||||||
|
printf("usage: %s <program> <int>\n",argv[0]);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
char *child_prog = argv[1]; // program to run as a child
|
||||||
|
int interval = atoi(argv[2]); // time to allow child to run
|
||||||
|
|
||||||
|
int pid = fork(); // fork execution
|
||||||
|
|
||||||
|
if(pid == 0){ // CHILD
|
||||||
|
execlp(child_prog, child_prog, NULL); // execute specified program
|
||||||
|
}
|
||||||
|
|
||||||
|
int status, ret; // PARENT
|
||||||
|
while(1){ // Loop until child done
|
||||||
|
int result;
|
||||||
|
sleep(interval); // interval to allow child to run
|
||||||
|
result = kill(pid,SIGSTOP); // send a stop signal to child
|
||||||
|
printf("SIGSTOP result: %d\n",result); // check on delivery
|
||||||
|
sleep(interval); // interval to allow child to run
|
||||||
|
result = kill(pid,SIGCONT); // send a continue signal to child
|
||||||
|
printf("SIGCONT result: %d\n",result); // check on delivery
|
||||||
|
|
||||||
|
ret = waitpid(pid, &status, WNOHANG); // check on child
|
||||||
|
if(ret == pid){ // if child is finished
|
||||||
|
break; // break from loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(WIFSIGNALED(status)){ // check if a signal ended the child
|
||||||
|
printf("child process %d terminated with signal %d\n",
|
||||||
|
pid,WTERMSIG(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
BIN
lab07-code.zip
Normal file
BIN
lab07-code.zip
Normal file
Binary file not shown.
18
lab07-code/Makefile
Normal file
18
lab07-code/Makefile
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
|
||||||
|
all : sleep_print select_AB read_AB
|
||||||
|
|
||||||
|
sleep_print : sleep_print.c
|
||||||
|
gcc -o $@ $^
|
||||||
|
|
||||||
|
select_AB : select_AB.c
|
||||||
|
gcc -o $@ $^
|
||||||
|
|
||||||
|
read_AB : read_AB.c
|
||||||
|
gcc -o $@ $^
|
||||||
|
|
||||||
|
select_AB_children_alive : select_AB_children_alive.c
|
||||||
|
gcc -o $@ $^
|
||||||
|
|
||||||
|
clean :
|
||||||
|
rm -f sleep_print select_AB read_AB
|
||||||
|
|
208
lab07-code/QUESTIONS.txt
Normal file
208
lab07-code/QUESTIONS.txt
Normal file
|
@ -0,0 +1,208 @@
|
||||||
|
__________________
|
||||||
|
|
||||||
|
LAB 07 QUESTIONS
|
||||||
|
__________________
|
||||||
|
|
||||||
|
|
||||||
|
- Name: Michael Zhang
|
||||||
|
- NetID: zhan4854
|
||||||
|
|
||||||
|
Answer the questions below according to the lab specification. Write
|
||||||
|
your answers directly in this text file and submit it to complete Lab01.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 1 `sleep_print.c'
|
||||||
|
=========================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Compile `sleep_print.c' using the provided `Makefile' which compiles
|
||||||
|
it to `sleep_print'. Run the program as
|
||||||
|
,----
|
||||||
|
| ./sleep_print 1 "hello"
|
||||||
|
`----
|
||||||
|
After a few seconds, press Ctrl-C to send an interrupt signal. Paste
|
||||||
|
the results of your run below.
|
||||||
|
|
||||||
|
1 : hello 2 : hello 3 : hello 4 : hello 5 : hello 6 : hello 7 : hello ^Csleep_print: signaled, setting flag
|
||||||
|
8 : hello sleep_print: finishing
|
||||||
|
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
Examine the code for `sleep_print.c' and note the use of the
|
||||||
|
`sigaction()' function to set up signal handlers. Inspect the signal
|
||||||
|
handler function and describe how the signal handler causes the
|
||||||
|
`sleep_print' to shut down in the space below.
|
||||||
|
|
||||||
|
|
||||||
|
The signal handler changes a global variable that the while loop is using to
|
||||||
|
determine whether or not to continue. When the signal handler is called, the
|
||||||
|
value is changed so the loop stops.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 2 `read_AB.c'
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Note that `read_AB.c' uses the same techniques as `sleep_print.c' to
|
||||||
|
set up signal handlers and shut down on receiving a signal.
|
||||||
|
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Compile `read_AB.c' and run it. Paste the results of running it for a
|
||||||
|
few seconds below. Use Ctl-C to send an interrupt to end the program.
|
||||||
|
|
||||||
|
|
||||||
|
read_AB: listening for children
|
||||||
|
A had: | 1 : AAAA |
|
||||||
|
B had: | 1 : BBBB |
|
||||||
|
A had: | 2 : AAAA |
|
||||||
|
B had: | 2 : BBBB |
|
||||||
|
A had: | 3 : AAAA 4 : AAAA 5 : AAAA |
|
||||||
|
B had: | 3 : BBBB |
|
||||||
|
A had: | 6 : AAAA 7 : AAAA 8 : AAAA |
|
||||||
|
^Csleep_print: signaled, setting flag
|
||||||
|
sleep_print: signaled, setting flag
|
||||||
|
read_AB: signaled, setting flag
|
||||||
|
B had: | 4 : BBBB |
|
||||||
|
read_AB: finishing
|
||||||
|
sleep_print: signaled, setting flag
|
||||||
|
sleep_print: signaled, setting flag
|
||||||
|
sleep_print: finishing
|
||||||
|
sleep_print: finishing
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
Examine the code for `read_AB.c' and note where `pipe(), fork(),
|
||||||
|
dup2()' are used to set up a communication channel for two children
|
||||||
|
referred to as A and B. Note that these two children both run
|
||||||
|
`sleep_print' but A has a 1 second delay while B has a 3 second delay.
|
||||||
|
Note the main `while()' of `read_AB' which repeatedly reads from the
|
||||||
|
pipes of its children.
|
||||||
|
|
||||||
|
In the space below explain why the output for the program has the
|
||||||
|
ordering that it does despite A producing A at a faster rate (every 1
|
||||||
|
second) than B (every 3 seconds).
|
||||||
|
|
||||||
|
In the 3 second delay that it took B to print out its second output, A had
|
||||||
|
already printed out 3 more lines, and they were all loaded up in the pipe ready
|
||||||
|
to be read. That's why the next line for A had 3 outputs.
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
In the output for `read_AB' there should be some lines for Child A
|
||||||
|
that look like
|
||||||
|
,----
|
||||||
|
| A had: | 1 : AAAA |
|
||||||
|
`----
|
||||||
|
but also some lines that look like
|
||||||
|
,----
|
||||||
|
| A had: | 4 : AAAA 5 : AAAA |
|
||||||
|
`----
|
||||||
|
and
|
||||||
|
,----
|
||||||
|
| A had: |15 : AAAA 16 : AAAA 17 : AAAA |
|
||||||
|
`----
|
||||||
|
while Child B lines always look like
|
||||||
|
,----
|
||||||
|
| B had: | 4 : BBBB |
|
||||||
|
`----
|
||||||
|
Explain why there is variance in Child A lines while Child B lines
|
||||||
|
look the same.
|
||||||
|
|
||||||
|
For child A, it really depends on exactly when it started relative to when B
|
||||||
|
started. For example,
|
||||||
|
|
||||||
|
A: | | | |
|
||||||
|
B: | |
|
||||||
|
|
||||||
|
may only show 2 counters worth of AAAAs while
|
||||||
|
|
||||||
|
A: | | | |
|
||||||
|
B: | |
|
||||||
|
|
||||||
|
will show 3counters worth of AAAAs. In the first case, it really just comes down
|
||||||
|
to the scheduler and the order in which these processes are executed.
|
||||||
|
|
||||||
|
PROBLEM 3 `select_AB.c'
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Note that `select_AB.c' uses the same techniques as `sleep_print.c' to
|
||||||
|
set up signal handlers and shut down on receiving a signal.
|
||||||
|
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Compile `select_AB.c' and run it. Paste the results of running it for
|
||||||
|
a few seconds below. Use Ctl-C to send an interrupt to end the
|
||||||
|
program.
|
||||||
|
|
||||||
|
select_AB: listening for children
|
||||||
|
A had: | 1 : AAAA |
|
||||||
|
A had: | 2 : AAAA |
|
||||||
|
B had: | 1 : BBBB |
|
||||||
|
A had: | 3 : AAAA |
|
||||||
|
A had: | 4 : AAAA |
|
||||||
|
A had: | 5 : AAAA |
|
||||||
|
B had: | 2 : BBBB |
|
||||||
|
A had: | 6 : AAAA |
|
||||||
|
A had: | 7 : AAAA |
|
||||||
|
A had: | 8 : AAAA |
|
||||||
|
B had: | 3 : BBBB |
|
||||||
|
A had: | 9 : AAAA |
|
||||||
|
A had: |10 : AAAA |
|
||||||
|
^Csleep_print: signaled, setting flag
|
||||||
|
sleep_print: signaled, setting flag
|
||||||
|
select_AB: signaled, setting flag
|
||||||
|
sleep_print: finishing
|
||||||
|
sleep_print: finishing
|
||||||
|
B had: | 4 : BBBB |
|
||||||
|
select_AB: finishing
|
||||||
|
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
Examine the code for `select_AB.c'. Like `read_AB', it uses `pipe(),
|
||||||
|
fork(), dup2()' to set up a communication channel for two children, A
|
||||||
|
and B, which run `sleep_print' at differing rates. However, the main
|
||||||
|
`while()' of `select_AB' uses the `select()' system call to sleep
|
||||||
|
until output is available from a child.
|
||||||
|
|
||||||
|
In the space below explain why the output for the `select_AB' has the
|
||||||
|
ordering that it does and why it differs from `read_AB'.
|
||||||
|
|
||||||
|
The select() system call "allow a program to monitor multiple file descriptors,
|
||||||
|
waiting until one or more of the file descriptors become 'ready' for some class
|
||||||
|
of I/O operation," according to the man page. This means that the parent process
|
||||||
|
is actually able to monitor both pipes and select whichever one has output
|
||||||
|
first. Then it prints that directly to the screen. That's why A's output never
|
||||||
|
get loaded up multiple times in the buffer and B's still prints once every 3 of
|
||||||
|
A's prints, unlike read_AB, which reads A and B in a fixed order, so if A is
|
||||||
|
ready to print again before B has even gotten a chance to print, it will just
|
||||||
|
sit in the queue on top of the previous one.
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
The output for `read_AB' contained mixed lengths for child A output as
|
||||||
|
in
|
||||||
|
,----
|
||||||
|
| A had: | 1 : AAAA |
|
||||||
|
| A had: | 4 : AAAA 5 : AAAA |
|
||||||
|
| A had: |15 : AAAA 16 : AAAA 17 : AAAA |
|
||||||
|
`----
|
||||||
|
|
||||||
|
Explain why the output for `select_AB' does not have such differences.
|
||||||
|
|
||||||
|
Since select_AB monitors the pipes, it will print immediately after the pipe
|
||||||
|
that A used has something to write. If I recall correctly, this is what's used
|
||||||
|
in many IRC servers to handle inputs coming in from multiple clients.
|
||||||
|
|
BIN
lab07-code/read_AB
Executable file
BIN
lab07-code/read_AB
Executable file
Binary file not shown.
78
lab07-code/read_AB.c
Normal file
78
lab07-code/read_AB.c
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
// Start two child processes which run sleep_print with differing
|
||||||
|
// delays and messages. Their output is redirected through pipes
|
||||||
|
// readable by the parent. The main loop alternates reading from each
|
||||||
|
// child in turn. Handle interrupt and terminate signals gracefully
|
||||||
|
// by setting a flag to shut down.
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#define PREAD 0 // read and write ends of pipes
|
||||||
|
#define PWRITE 1
|
||||||
|
|
||||||
|
int signaled = 0; // global variable controls exit from main loop
|
||||||
|
|
||||||
|
void handle_signals(int signo){ // handler for some signals
|
||||||
|
char *msg = "read_AB: signaled, setting flag\n"; // print a message about the signal
|
||||||
|
write(STDERR_FILENO,msg,strlen(msg)); // avoid fprintf() as it is not reentrant
|
||||||
|
signaled = 1; // set global variable to indicate signal received
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int make_child(int pip[], char *delay, char *msg){ // Create a child which runs sleep_print
|
||||||
|
pipe(pip);
|
||||||
|
int pid = fork();
|
||||||
|
if(pid != 0){ // PARENT
|
||||||
|
return pid; // just return child pid
|
||||||
|
}
|
||||||
|
dup2(pip[PWRITE], STDOUT_FILENO); // CHILD: redirect standard out to pipe
|
||||||
|
execlp("./sleep_print","./sleep_print",delay,msg,NULL); // should not return
|
||||||
|
perror("exec failed");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
struct sigaction my_sa = {}; // portable signal handling setup with sigaction()
|
||||||
|
my_sa.sa_handler = handle_signals; // run function handle_signals
|
||||||
|
sigemptyset(&my_sa.sa_mask); // don't block any other signals during handling
|
||||||
|
my_sa.sa_flags = SA_RESTART; // always restart system calls on signals possible
|
||||||
|
sigaction(SIGTERM, &my_sa, NULL); // register SIGTERM with given action
|
||||||
|
sigaction(SIGINT, &my_sa, NULL); // register SIGINT with given action
|
||||||
|
|
||||||
|
int pipeA[2], pipeB[2]; // pipes for children to speak to parent
|
||||||
|
int pidA = make_child(pipeA, "1", "AAAA"); // create two children with different
|
||||||
|
int pidB = make_child(pipeB, "3", "BBBB"); // messages and delays between prints
|
||||||
|
|
||||||
|
close(pipeA[PWRITE]); // Parent doesn't use the write ends
|
||||||
|
close(pipeB[PWRITE]);
|
||||||
|
|
||||||
|
printf("read_AB: listening for children\n");
|
||||||
|
|
||||||
|
while(!signaled){ // enter a loop to listen until signaled or children die
|
||||||
|
char buf[1024];
|
||||||
|
int n;
|
||||||
|
|
||||||
|
n = read(pipeA[PREAD], buf, 1024); // read from pipeA
|
||||||
|
buf[n] = '\0';
|
||||||
|
fprintf(stdout,"A had: |%s|\n",buf);
|
||||||
|
|
||||||
|
n = read(pipeB[PREAD], buf, 1024); // read from pipeB
|
||||||
|
buf[n] = '\0';
|
||||||
|
fprintf(stdout,"B had: |%s|\n",buf);
|
||||||
|
}
|
||||||
|
kill(pidA, SIGTERM); // keyboard interrupt will signal children but a
|
||||||
|
kill(pidB, SIGTERM); // 'kill read_AB' will not, so always signal them here
|
||||||
|
|
||||||
|
fprintf(stderr,"read_AB: finishing\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
BIN
lab07-code/select_AB
Executable file
BIN
lab07-code/select_AB
Executable file
Binary file not shown.
89
lab07-code/select_AB.c
Normal file
89
lab07-code/select_AB.c
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
// Start two child processes which run sleep_print with differing
|
||||||
|
// delays and messages. Their output is redirected through pipes
|
||||||
|
// readable by the parent. Use select() to grab input from either
|
||||||
|
// pipe as it becomes available. Handle interrupt and terminate
|
||||||
|
// signals gracefully by setting a flag to shut down.
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#define PREAD 0 // read and write ends of pipes
|
||||||
|
#define PWRITE 1
|
||||||
|
|
||||||
|
int signaled = 0; // global variable controls exit from main loop
|
||||||
|
|
||||||
|
void handle_signals(int signo){ // handler for some signals
|
||||||
|
char *msg = "select_AB: signaled, setting flag\n"; // print a message about the signal
|
||||||
|
write(STDERR_FILENO,msg,strlen(msg)); // avoid fprintf() as it is not reentrant
|
||||||
|
signaled = 1; // set global variable to indicate signal received
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int make_child(int pip[], char *delay, char *msg){ // Create a child which runs sleep_print
|
||||||
|
pipe(pip);
|
||||||
|
int pid = fork();
|
||||||
|
if(pid != 0){ // PARENT
|
||||||
|
return pid; // just return child pid
|
||||||
|
}
|
||||||
|
dup2(pip[PWRITE], STDOUT_FILENO); // CHILD: redirect standard out to pipe
|
||||||
|
execlp("./sleep_print","./sleep_print",delay,msg,NULL); // should not return
|
||||||
|
perror("exec failed");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
struct sigaction my_sa = {}; // portable signal handling setup with sigaction()
|
||||||
|
my_sa.sa_handler = handle_signals; // run function handle_signals
|
||||||
|
sigemptyset(&my_sa.sa_mask); // don't block any other signals during handling
|
||||||
|
my_sa.sa_flags = SA_RESTART; // always restart system calls on signals possible
|
||||||
|
sigaction(SIGTERM, &my_sa, NULL); // register SIGTERM with given action
|
||||||
|
sigaction(SIGINT, &my_sa, NULL); // register SIGINT with given action
|
||||||
|
|
||||||
|
int pipeA[2], pipeB[2]; // pipes for children to speak to parent
|
||||||
|
int pidA = make_child(pipeA, "1", "AAAA"); // create two children with different
|
||||||
|
int pidB = make_child(pipeB, "3", "BBBB"); // messages and delays between prints
|
||||||
|
|
||||||
|
close(pipeA[PWRITE]); // Parent doesn't use the write ends
|
||||||
|
close(pipeB[PWRITE]);
|
||||||
|
|
||||||
|
printf("select_AB: listening for children\n");
|
||||||
|
|
||||||
|
while(!signaled){ // enter a loop to listen until signaled or children die
|
||||||
|
fd_set read_set; // set of file descriptors for select()
|
||||||
|
FD_ZERO(&read_set); // init the set
|
||||||
|
FD_SET(pipeA[PREAD], &read_set); // set fds to contain read ends of pipe
|
||||||
|
FD_SET(pipeB[PREAD], &read_set);
|
||||||
|
int maxfd = pipeA[PREAD]; // need maximum fd for select()
|
||||||
|
maxfd = (maxfd < pipeB[PREAD]) ? pipeB[PREAD] : maxfd;
|
||||||
|
|
||||||
|
select(maxfd+1, &read_set, NULL, NULL, NULL); // sleep, wake up if any pipe ready for reading
|
||||||
|
|
||||||
|
char buf[1024];
|
||||||
|
int n;
|
||||||
|
if(FD_ISSET(pipeA[PREAD], &read_set)){ // check if pipeA has anything
|
||||||
|
n = read(pipeA[PREAD], buf, 1024); // read from pipe
|
||||||
|
buf[n] = '\0';
|
||||||
|
fprintf(stdout,"A had: |%s|\n",buf);
|
||||||
|
}
|
||||||
|
if(FD_ISSET(pipeB[PREAD], &read_set)){ // check if pipeB has anything
|
||||||
|
n = read(pipeB[PREAD], buf, 1024); // read from pipe
|
||||||
|
buf[n] = '\0';
|
||||||
|
fprintf(stdout,"B had: |%s|\n",buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
kill(pidA, SIGTERM); // keyboard interrupt will signal children but a
|
||||||
|
kill(pidB, SIGTERM); // 'kill select_AB' will not, so always signal them here
|
||||||
|
|
||||||
|
fprintf(stderr,"select_AB: finishing\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
BIN
lab07-code/sleep_print
Executable file
BIN
lab07-code/sleep_print
Executable file
Binary file not shown.
49
lab07-code/sleep_print.c
Normal file
49
lab07-code/sleep_print.c
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
// In an infinite loop, sleep for an interval and then print a
|
||||||
|
// message. Catch interrupt and terminate signals and cause the loop
|
||||||
|
// program to end by adjusting a global flag.
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
int signaled = 0; // global variable controls exit from main loop
|
||||||
|
void handle_signals(int signo){ // handler for some signals
|
||||||
|
char *msg = "sleep_print: signaled, setting flag\n"; // print a message about the signal
|
||||||
|
write(STDERR_FILENO,msg,strlen(msg)); // avoid fprintf() as it is not reentrant
|
||||||
|
signaled = 1; // set global variable to indicate signal received
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
if(argc < 3){
|
||||||
|
printf("usage: %s <delay> <message>\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sigaction my_sa = {}; // portable signal handling setup with sigaction()
|
||||||
|
my_sa.sa_handler = handle_signals; // run function handle_signals
|
||||||
|
sigemptyset(&my_sa.sa_mask); // don't block any other signals during handling
|
||||||
|
my_sa.sa_flags = SA_RESTART; // always restart system calls on signals possible
|
||||||
|
sigaction(SIGTERM, &my_sa, NULL); // register SIGTERM with given action
|
||||||
|
sigaction(SIGINT, &my_sa, NULL); // register SIGINT with given action
|
||||||
|
|
||||||
|
int delay = atoi(argv[1]); // sleep delay
|
||||||
|
char *message = argv[2]; // message to print
|
||||||
|
int count=1;
|
||||||
|
while(!signaled){
|
||||||
|
sleep(delay);
|
||||||
|
printf("%2d : %s ",count,message);
|
||||||
|
fflush(stdout);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
fprintf(stderr,"sleep_print: finishing\n"); // print to stderr in case stdout is going to a pipe
|
||||||
|
return 0;
|
||||||
|
}
|
BIN
lab08-code.zip
Normal file
BIN
lab08-code.zip
Normal file
Binary file not shown.
15
lab08-code/Makefile
Normal file
15
lab08-code/Makefile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
CFLAGS = -Wall -g
|
||||||
|
CC = gcc $(CFLAGS)
|
||||||
|
|
||||||
|
all : em_server em_client
|
||||||
|
|
||||||
|
em_server : em_server.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
em_client : em_client.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
clean :
|
||||||
|
rm -f em_server em_client *.fifo
|
||||||
|
|
||||||
|
|
102
lab08-code/QUESTIONS.txt
Normal file
102
lab08-code/QUESTIONS.txt
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
__________________
|
||||||
|
|
||||||
|
LAB 08 QUESTIONS
|
||||||
|
__________________
|
||||||
|
|
||||||
|
|
||||||
|
- Name: (FILL THIS in)
|
||||||
|
- NetID: (THE kauf0095 IN kauf0095@umn.edu)
|
||||||
|
|
||||||
|
Answer the questions below according to the lab specification. Write
|
||||||
|
your answers directly in this text file and submit it to complete Lab01.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 1 `server_em.c'
|
||||||
|
=======================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Examine the source code for `em_server.c'. Note of the 3 FIFOs that
|
||||||
|
are used: Requests, Completions, and Data. Describe what appears to
|
||||||
|
be the purpose of each from the server perspective.
|
||||||
|
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
What mechanism is used to notify clients that their request has been
|
||||||
|
filled and that data is ready on the Data FIFO?
|
||||||
|
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
How many clients have information on each of the FIFOs:
|
||||||
|
- On the Request FIFO?
|
||||||
|
- On the Completion FIFO?
|
||||||
|
- On the Data FIFO?
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 2 `client_em.c'
|
||||||
|
=======================
|
||||||
|
|
||||||
|
Note that `read_AB.c' uses the same techniques as `sleep_print.c' to
|
||||||
|
set up signal handlers and shut down on receiving a signal.
|
||||||
|
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Examine the `while()' loop in the client. When waiting for the server
|
||||||
|
to respond, does the client make use of busy waiting (polling),
|
||||||
|
interrupt-driven waiting, or something in between?
|
||||||
|
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
Experiment with changing the while() loop associated with server
|
||||||
|
responses. Time running 100 transactions using the provided
|
||||||
|
`run_simulations.sh' script as in
|
||||||
|
,----
|
||||||
|
| $> time run_simulation.sh 100 > xxx
|
||||||
|
`----
|
||||||
|
Note the timing. You may need to discuss with your TA how to interpret
|
||||||
|
the results of the shell `time' command which measures CPU utilization
|
||||||
|
for programs.
|
||||||
|
|
||||||
|
Comment out the `while()' loop associated with waiting and un-comment
|
||||||
|
the other `while()' loop. Re-run the above script invocation and
|
||||||
|
report the differences in timing.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 3 Protocol
|
||||||
|
==================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Describe the overall protocol used by the client and server to
|
||||||
|
communicate. Use the labels in the messages like `C SERVER' and `B
|
||||||
|
CLIENT' to help you organize the order what happens when and things
|
||||||
|
can happen in an unpredictable order.
|
||||||
|
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
In an initial version of the programs, the client used the following
|
||||||
|
line to wait for a server response.
|
||||||
|
,----
|
||||||
|
| raise(SIGSTOP);
|
||||||
|
`----
|
||||||
|
The `raise()' command sends a signal to the running process so that
|
||||||
|
the effect of this line is to stop the current process until a signal
|
||||||
|
to continue is received. This approach was found to fail in many
|
||||||
|
cases causing the entire system to stall.
|
||||||
|
|
||||||
|
Based on your understanding of the protocol above, WHY could simply
|
||||||
|
stopping the client process result a breakdown?
|
||||||
|
|
||||||
|
You may wish to uncomment and try this version in the code.
|
86
lab08-code/em_client.c
Normal file
86
lab08-code/em_client.c
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
// Client code to look up an email based on name
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
// structure to store a lookup_t. client fills in with name, server
|
||||||
|
// fills in email if found in
|
||||||
|
typedef struct {
|
||||||
|
int pid;
|
||||||
|
char name[256];
|
||||||
|
char email[256];
|
||||||
|
} lookup_t;
|
||||||
|
|
||||||
|
int signalled = 0;
|
||||||
|
void handle_signals(int sig_num){
|
||||||
|
signalled = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
struct sigaction my_sa = {}; // portable signal handling setup with sigaction()
|
||||||
|
my_sa.sa_handler = handle_signals; // run function handle_signals
|
||||||
|
sigaction(SIGCONT, &my_sa, NULL); // register SIGCONT with given action
|
||||||
|
|
||||||
|
|
||||||
|
if(argc < 2){
|
||||||
|
printf("usage: %s <name>\n",argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
lookup_t request = {};
|
||||||
|
request.pid = getpid();
|
||||||
|
strcpy(request.name, argv[1]);
|
||||||
|
|
||||||
|
int requests_fd = open("requests.fifo", O_RDWR); // open read/write in case server hasn't started
|
||||||
|
int completions_fd = open("completions.fifo", O_RDWR); // open read or write only may cause hangs if the
|
||||||
|
int data_fd = open("data.fifo", O_RDWR); // other end of the pipe has not be openened
|
||||||
|
|
||||||
|
printf("%d A CLIENT: sending request: {pid=%d name=\"%s\" }\n",
|
||||||
|
request.pid, request.pid, request.name);
|
||||||
|
write(requests_fd, &request, sizeof(lookup_t));
|
||||||
|
printf("%d B CLIENT: pid %d stopping\n",request.pid,request.pid);
|
||||||
|
|
||||||
|
while(!signalled){
|
||||||
|
sleep(1); // sleep for 1 second, wake up on on signal
|
||||||
|
}
|
||||||
|
|
||||||
|
// while(!signalled); // poll for busy waiting
|
||||||
|
|
||||||
|
// raise(SIGSTOP); // buggy waiting
|
||||||
|
|
||||||
|
// if(!signalled){ // also buggy but much harder to hit a stall
|
||||||
|
// raise(SIGSTOP); // try 'run_simulation.sh 3000' if you have some time
|
||||||
|
// }
|
||||||
|
|
||||||
|
printf("%d B CLIENT: pid %d signalled to continue\n",request.pid,request.pid);
|
||||||
|
|
||||||
|
lookup_t response;
|
||||||
|
read(data_fd, &response, sizeof(lookup_t));
|
||||||
|
printf("%d C CLIENT: received response: {pid=%d name=\"%s\" email=\"%s\"}\n",
|
||||||
|
response.pid, response.pid, response.name, response.email);
|
||||||
|
|
||||||
|
|
||||||
|
if(request.pid != response.pid){
|
||||||
|
printf("CLIENT PROBLEM: PID %d vs %d\n", request.pid, response.pid);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int pid = getpid();
|
||||||
|
write(completions_fd, &pid, sizeof(int));
|
||||||
|
printf("%d D CLIENT: pid %d indicating completion\n",request.pid,request.pid);
|
||||||
|
|
||||||
|
// printf("CLIENT: result: %s\n",response.email);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
101
lab08-code/em_server.c
Normal file
101
lab08-code/em_server.c
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
// Server code which contains a name/email pairs and will fulfill
|
||||||
|
// requests from a client through FIFOs.
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
// data the server has and clients want: pairings of name and email
|
||||||
|
char *data[][2] = {
|
||||||
|
{"Chris Kauffman" ,"kauffman@umn.edu"},
|
||||||
|
{"Christopher Jonathan" ,"jonat003@umn.edu"},
|
||||||
|
{"Amy Larson" ,"larson@cs.umn.edu"},
|
||||||
|
{"Chris Dovolis" ,"dovolis@cs.umn.edu"},
|
||||||
|
{"Dan Knights" ,"knights@cs.umn.edu"},
|
||||||
|
{"George Karypis" ,"karypis@cs.umn.edu"},
|
||||||
|
{"Steven Jensen" ,"sjensen@cs.umn.edu"},
|
||||||
|
{"Daniel Keefe" ,"dfk@umn.edu"},
|
||||||
|
{"Michael W. Whalen" ,"whalen@cs.umn.edu"},
|
||||||
|
{"Catherine Qi Zhao" ,"qzhao@umn.edu"},
|
||||||
|
{"Dan Challou" ,"challou@cs.umn.edu"},
|
||||||
|
{"Steven Wu" ,"zsw@umn.edu"},
|
||||||
|
{"Michael Steinbach" ,"steinbac@cs.umn.edu"},
|
||||||
|
{"Jon Weissman" ,"jon@cs.umn.edu"},
|
||||||
|
{"Victoria Interrante" ,"interran@cs.umn.edu"},
|
||||||
|
{"Shana Watters" ,"watt0087@umn.edu"},
|
||||||
|
{"James Parker" ,"jparker@cs.umn.edu"},
|
||||||
|
{"James Moen" ,"moen0017@cs.umn.edu"},
|
||||||
|
{"Daniel Giesel" ,"giese138@umn.edu"},
|
||||||
|
{"Jon Read" ,"readx028@umn.edu"},
|
||||||
|
{"Sara Stokowski" ,"stoko004@umn.edu"},
|
||||||
|
{NULL , NULL},
|
||||||
|
};
|
||||||
|
|
||||||
|
// structure to store a lookup_t. client fills in with name, server
|
||||||
|
// fills in email if found in
|
||||||
|
typedef struct {
|
||||||
|
int pid;
|
||||||
|
char name[256];
|
||||||
|
char email[256];
|
||||||
|
} lookup_t;
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
printf("starting server\n");
|
||||||
|
|
||||||
|
remove("requests.fifo");
|
||||||
|
remove("completions.fifo");
|
||||||
|
remove("data.fifo");
|
||||||
|
printf("SERVER: removed old fifos\n");
|
||||||
|
|
||||||
|
mkfifo("requests.fifo", S_IRUSR | S_IWUSR);
|
||||||
|
mkfifo("completions.fifo", S_IRUSR | S_IWUSR);
|
||||||
|
mkfifo("data.fifo", S_IRUSR | S_IWUSR);
|
||||||
|
printf("SERVER: created new fifos\n");
|
||||||
|
|
||||||
|
int requests_fd = open("requests.fifo", O_RDWR); // open read/write in case server hasn't started
|
||||||
|
int completions_fd = open("completions.fifo", O_RDWR); // open read or write only may cause hangs if the
|
||||||
|
int data_fd = open("data.fifo", O_RDWR); // other end of the pipe has not be openened
|
||||||
|
printf("SERVER: opened FIFOs, listening\n");
|
||||||
|
|
||||||
|
while(1){
|
||||||
|
lookup_t request;
|
||||||
|
read(requests_fd, &request, sizeof(lookup_t));
|
||||||
|
printf("%d B SERVER: received request {pid=%d name=\"%s\" }\n",
|
||||||
|
request.pid, request.pid, request.name);
|
||||||
|
char *name = request.name;
|
||||||
|
int found = 0;
|
||||||
|
for(int i=0; data[i][0] != NULL; i++){
|
||||||
|
if(strcmp(name, data[i][0]) == 0){
|
||||||
|
strcpy(request.email, data[i][1]);
|
||||||
|
found = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found){
|
||||||
|
strcpy(request.email, "NOT FOUND");
|
||||||
|
}
|
||||||
|
printf("%d B SERVER: filling request {pid=%d name=\"%s\" email=\"%s\" }\n",
|
||||||
|
request.pid,request.pid, request.name, request.email);
|
||||||
|
write(data_fd, &request, sizeof(request));
|
||||||
|
printf("%d B SERVER: signaling pid %d\n",
|
||||||
|
request.pid, request.pid);
|
||||||
|
kill(request.pid, SIGCONT);
|
||||||
|
int done_pid = -1;
|
||||||
|
read(completions_fd, &done_pid, sizeof(int));
|
||||||
|
printf("%d E SERVER: %d completion\n",done_pid,done_pid);
|
||||||
|
if(request.pid != done_pid){
|
||||||
|
printf("Server Problems: PID %d vs %d",
|
||||||
|
request.pid, done_pid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
61
lab08-code/run_simulation.sh
Executable file
61
lab08-code/run_simulation.sh
Executable file
|
@ -0,0 +1,61 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# usage: run_smulations.sh 20
|
||||||
|
#
|
||||||
|
# Start an em_server then run multiple simultaneous em_clients
|
||||||
|
# connecting to find various emails. Accepts a command line argument
|
||||||
|
# which is the number of clients to run.
|
||||||
|
|
||||||
|
nclients=10
|
||||||
|
|
||||||
|
if (( $# >= 1 )); then
|
||||||
|
nclients=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
names=(
|
||||||
|
"Chris Kauffman"
|
||||||
|
"Christopher Jonathan"
|
||||||
|
"Amy Larson"
|
||||||
|
"Chris Dovolis"
|
||||||
|
"Dan Knights"
|
||||||
|
"George Karypis"
|
||||||
|
"Steven Jensen"
|
||||||
|
"Daniel Keefe"
|
||||||
|
"Michael W. Whalen"
|
||||||
|
"Catherine Qi Zhao"
|
||||||
|
"Dan Challou"
|
||||||
|
"Steven Wu"
|
||||||
|
"Michael Steinbach"
|
||||||
|
"Jon Weissman"
|
||||||
|
"Victoria Interrante"
|
||||||
|
"Shana Watters"
|
||||||
|
"James Parker"
|
||||||
|
"James Moen"
|
||||||
|
"Daniel Giesel"
|
||||||
|
"Jon Read"
|
||||||
|
"Sara Stokowski"
|
||||||
|
)
|
||||||
|
|
||||||
|
len=${#names[*]}
|
||||||
|
|
||||||
|
# kill em_server
|
||||||
|
./em_server &
|
||||||
|
em_server_pid=$!
|
||||||
|
|
||||||
|
# start em_clients
|
||||||
|
pids=()
|
||||||
|
for i in `seq 0 $nclients`; do
|
||||||
|
idx=$((i % len))
|
||||||
|
# echo "${names[idx]}"
|
||||||
|
./em_client "${names[idx]}" &
|
||||||
|
pids[i]=$!
|
||||||
|
done
|
||||||
|
|
||||||
|
# echo "${pids[*]}"
|
||||||
|
|
||||||
|
# wait for jobs to finish
|
||||||
|
for pid in ${pids[*]}; do
|
||||||
|
wait $pid
|
||||||
|
done
|
||||||
|
|
||||||
|
kill $em_server_pid
|
BIN
lab09-code.zip
Normal file
BIN
lab09-code.zip
Normal file
Binary file not shown.
25
lab09-code/Makefile
Normal file
25
lab09-code/Makefile
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
CFLAGS = -Wall -g
|
||||||
|
CC = gcc $(CFLAGS)
|
||||||
|
|
||||||
|
all : em_server_mq em_client_mq \
|
||||||
|
em_server_fifo em_client_fifo
|
||||||
|
|
||||||
|
em_server_mq : em_server_mq.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
em_client_mq : em_client_mq.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
em_server_fifo : em_server_fifo.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
em_client_fifo : em_client_fifo.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
clean :
|
||||||
|
rm -f em_server_mq em_client_mq \
|
||||||
|
em_server_fifo em_client_fifo \
|
||||||
|
*.fifo
|
||||||
|
|
||||||
|
|
||||||
|
|
101
lab09-code/QUESTIONS.txt
Normal file
101
lab09-code/QUESTIONS.txt
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
__________________
|
||||||
|
|
||||||
|
LAB 09 QUESTIONS
|
||||||
|
__________________
|
||||||
|
|
||||||
|
|
||||||
|
- Name: Michael Zhang
|
||||||
|
- NetID: zhan4854
|
||||||
|
|
||||||
|
Answer the questions below according to the lab specification. Write
|
||||||
|
your answers directly in this text file and submit it to complete Lab01.
|
||||||
|
|
||||||
|
|
||||||
|
PROBLEM 1 `em_server_mq.c' and `em_server_mq.c'
|
||||||
|
===============================================
|
||||||
|
|
||||||
|
A
|
||||||
|
~
|
||||||
|
|
||||||
|
Examine the source code for `em_server_mq.c' and
|
||||||
|
`em_client_mq.c'. Describe the lines of code which are used to
|
||||||
|
establish the message queues used for communication. How many message
|
||||||
|
queues are there?
|
||||||
|
|
||||||
|
There's one message queue for the server, and one for the client. These are
|
||||||
|
created by msgget(key, 0644 | IPC_CREAT) where key was obtained by ftok using
|
||||||
|
the identity of the party that called it.
|
||||||
|
|
||||||
|
B
|
||||||
|
~
|
||||||
|
|
||||||
|
Describe the sending and receiving functions used in the server to put
|
||||||
|
messages onto the queue. Focus your attention on the server side
|
||||||
|
first. Describe each argument of the send/receive functions and its
|
||||||
|
purpose. You may wish to consult the textbook or manual page for the
|
||||||
|
functions to get more information.
|
||||||
|
|
||||||
|
To put a message onto the message queue you would use msgsnd, and send the
|
||||||
|
object containing the request information that you need.
|
||||||
|
|
||||||
|
C
|
||||||
|
~
|
||||||
|
|
||||||
|
Describe the protocol that appears to be used for communication. What
|
||||||
|
steps are taken by a client to make a request for an email address
|
||||||
|
lookup? How does the server respond? You may find it useful to use the
|
||||||
|
letters associated with print statements like "A" and "D". Note any
|
||||||
|
operations that might happen in an arbitrary order.
|
||||||
|
|
||||||
|
The protocol looks like this:
|
||||||
|
|
||||||
|
- The client first sends { name = argv[1], mtype = pid }.
|
||||||
|
- The server msgrcvs this, reads the name and name and mtype from the request
|
||||||
|
object and looks up the email associated with the name.
|
||||||
|
- The server then sends back { name = request.name, mtype = request.mtype,
|
||||||
|
email = the email that was looked up. }
|
||||||
|
- The email client makes sure that the pid that the mtype returned is the same
|
||||||
|
as the pid that it requested with.
|
||||||
|
|
||||||
|
D
|
||||||
|
~
|
||||||
|
|
||||||
|
Recall that the previous email lookup server/client that used FIFOs
|
||||||
|
would answer requests on a Data FIFO. The Server would only allow one
|
||||||
|
Client to access the Data FIFO at a time. This was to prevent the
|
||||||
|
client from retrieving data from the queue that was not intended for
|
||||||
|
them.
|
||||||
|
|
||||||
|
In the Message Queue server/client, potentially many clients are
|
||||||
|
accessing the To-Client queue simultaneously. Describe why there is
|
||||||
|
not a problem in this setting. Look carefully at the arguments used in
|
||||||
|
the `msgrcv()' call in the client.
|
||||||
|
|
||||||
|
This isn't a problem because msgrcv takes in a flag msgtype which in this case
|
||||||
|
is the pid of the client. This way, msgrcv will only return the messages
|
||||||
|
intended for the correct client. Of course, this isn't a valid security measure
|
||||||
|
but it produces the correct result.
|
||||||
|
|
||||||
|
E
|
||||||
|
~
|
||||||
|
|
||||||
|
In the FIFO server/client, sleeping and signaling was used to avoid
|
||||||
|
busily waiting for availability of the data. This complicated the
|
||||||
|
protocol somewhat in order to get more efficient resource utilization.
|
||||||
|
|
||||||
|
There is NO explicit sleeping in the Message Queue server/client which
|
||||||
|
might indicate it is less efficient as processes busily wait for
|
||||||
|
messages. Do some research on `msgsnd() / msgrcv()' calls to determine
|
||||||
|
if they are busy waiting (polling) or interrupt driven operations.
|
||||||
|
|
||||||
|
Confirm these answers by running `run_simulations_mq.sh' on a large
|
||||||
|
number of client and timing the results. A sample run might be
|
||||||
|
,----
|
||||||
|
| > time ./run_simulation_mq.sh 1000 > ~/tmp/xxx
|
||||||
|
`----
|
||||||
|
|
||||||
|
According to MSGOP(2), "If insufficient space is available in the queue, then
|
||||||
|
the default behavior of msgsnd() is to block until space becomes available. If
|
||||||
|
IPC_NOWAIT is specified in msgflg, then the call instead fails with the error
|
||||||
|
EAGAIN." This means they will wait for the message queue to become available
|
||||||
|
(after the other clients have read from it) before it sends.
|
BIN
lab09-code/em_client_fifo
Executable file
BIN
lab09-code/em_client_fifo
Executable file
Binary file not shown.
88
lab09-code/em_client_fifo.c
Normal file
88
lab09-code/em_client_fifo.c
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
// Client code to look up an email based on name
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
// structure to store a lookup_t. client fills in with name, server
|
||||||
|
// fills in email if found in
|
||||||
|
typedef struct {
|
||||||
|
int pid;
|
||||||
|
char name[256];
|
||||||
|
char email[256];
|
||||||
|
} lookup_t;
|
||||||
|
|
||||||
|
int signalled = 0;
|
||||||
|
void handle_signals(int sig_num){
|
||||||
|
signalled = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
struct sigaction my_sa = {}; // portable signal handling setup with sigaction()
|
||||||
|
my_sa.sa_handler = handle_signals; // run function handle_signals
|
||||||
|
sigaction(SIGCONT, &my_sa, NULL); // register SIGCONT with given action
|
||||||
|
|
||||||
|
|
||||||
|
if(argc < 2){
|
||||||
|
printf("usage: %s <name>\n",argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
lookup_t request = {};
|
||||||
|
request.pid = getpid();
|
||||||
|
strcpy(request.name, argv[1]);
|
||||||
|
|
||||||
|
int requests_fd = open("requests.fifo", O_RDWR); // open read/write in case server hasn't started
|
||||||
|
int completions_fd = open("completions.fifo", O_RDWR); // open read or write only may cause hangs if the
|
||||||
|
int data_fd = open("data.fifo", O_RDWR); // other end of the pipe has not be openened
|
||||||
|
|
||||||
|
printf("%d A CLIENT: sending request: {pid=%d name=\"%s\" }\n",
|
||||||
|
request.pid, request.pid, request.name);
|
||||||
|
write(requests_fd, &request, sizeof(lookup_t));
|
||||||
|
printf("%d B CLIENT: pid %d stopping\n",request.pid,request.pid);
|
||||||
|
|
||||||
|
while(!signalled){
|
||||||
|
struct timespec tm = {.tv_nsec = 1000};
|
||||||
|
nanosleep(&tm,NULL); // sleep a short duration
|
||||||
|
// sleep(1); // sleep for 1 second, wake up on on signal
|
||||||
|
}
|
||||||
|
|
||||||
|
// while(!signalled); // poll for busy waiting
|
||||||
|
|
||||||
|
// raise(SIGSTOP); // buggy waiting
|
||||||
|
|
||||||
|
// if(!signalled){ // also buggy but much harder to hit a stall
|
||||||
|
// raise(SIGSTOP); // try 'run_simulation.sh 3000' if you have some time
|
||||||
|
// }
|
||||||
|
|
||||||
|
printf("%d B CLIENT: pid %d signalled to continue\n",request.pid,request.pid);
|
||||||
|
|
||||||
|
lookup_t response;
|
||||||
|
read(data_fd, &response, sizeof(lookup_t));
|
||||||
|
printf("%d C CLIENT: received response: {pid=%d name=\"%s\" email=\"%s\"}\n",
|
||||||
|
response.pid, response.pid, response.name, response.email);
|
||||||
|
|
||||||
|
|
||||||
|
if(request.pid != response.pid){
|
||||||
|
printf("CLIENT PROBLEM: PID %d vs %d\n", request.pid, response.pid);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int pid = getpid();
|
||||||
|
write(completions_fd, &pid, sizeof(int));
|
||||||
|
printf("%d D CLIENT: pid %d indicating completion\n",request.pid,request.pid);
|
||||||
|
|
||||||
|
// printf("CLIENT: result: %s\n",response.email);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
BIN
lab09-code/em_client_mq
Executable file
BIN
lab09-code/em_client_mq
Executable file
Binary file not shown.
53
lab09-code/em_client_mq.c
Normal file
53
lab09-code/em_client_mq.c
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
// Client code to look up an email based on name; contacts servers via
|
||||||
|
// System V IPC message queues.
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/ipc.h>
|
||||||
|
#include <sys/msg.h>
|
||||||
|
|
||||||
|
// structure to store a lookup. client fills in with name, server
|
||||||
|
// fills in email if found in
|
||||||
|
typedef struct {
|
||||||
|
long mtype; // contains PID of sending process
|
||||||
|
char name[256]; // name desired
|
||||||
|
char email[256]; // email associated with name
|
||||||
|
} lookup_t;
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]){
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
|
||||||
|
if(argc < 2){
|
||||||
|
printf("usage: %s <name>\n",argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
key_t key;
|
||||||
|
key = ftok("em_server_mq.c", 0);
|
||||||
|
int to_server_qid = msgget(key, 0644 | IPC_CREAT);
|
||||||
|
key = ftok("em_client_mq.c", 0);
|
||||||
|
int to_clients_qid = msgget(key, 0644 | IPC_CREAT);
|
||||||
|
|
||||||
|
int my_pid = getpid();
|
||||||
|
lookup_t request = {};
|
||||||
|
request.mtype = my_pid;
|
||||||
|
strcpy(request.name, argv[1]);
|
||||||
|
|
||||||
|
printf("%ld A CLIENT: sending request: {pid=%ld name=\"%s\" }\n",
|
||||||
|
request.mtype, request.mtype, request.name);
|
||||||
|
msgsnd(to_server_qid, &request, sizeof(lookup_t), 0);
|
||||||
|
|
||||||
|
lookup_t response = {};
|
||||||
|
msgrcv(to_clients_qid, &response, sizeof(lookup_t), my_pid, 0);
|
||||||
|
|
||||||
|
printf("%ld D CLIENT: received response: {pid=%ld name=\"%s\" email=\"%s\"}\n",
|
||||||
|
response.mtype, response.mtype, response.name, response.email);
|
||||||
|
|
||||||
|
if(my_pid != response.mtype){
|
||||||
|
printf("CLIENT PROBLEM: PID %d vs %ld\n", my_pid, response.mtype);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
BIN
lab09-code/em_server_fifo
Executable file
BIN
lab09-code/em_server_fifo
Executable file
Binary file not shown.
104
lab09-code/em_server_fifo.c
Normal file
104
lab09-code/em_server_fifo.c
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
// Server code which contains a name/email pairs and will fulfill
|
||||||
|
// requests from a client through FIFOs.
|
||||||
|
#include <errno.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
// data the server has and clients want: pairings of name and email
|
||||||
|
char *data[][2] = {
|
||||||
|
{"Chris Kauffman", "kauffman@umn.edu"},
|
||||||
|
{"Christopher Jonathan", "jonat003@umn.edu"},
|
||||||
|
{"Amy Larson", "larson@cs.umn.edu"},
|
||||||
|
{"Chris Dovolis", "dovolis@cs.umn.edu"},
|
||||||
|
{"Dan Knights", "knights@cs.umn.edu"},
|
||||||
|
{"George Karypis", "karypis@cs.umn.edu"},
|
||||||
|
{"Steven Jensen", "sjensen@cs.umn.edu"},
|
||||||
|
{"Daniel Keefe", "dfk@umn.edu"},
|
||||||
|
{"Michael W. Whalen", "whalen@cs.umn.edu"},
|
||||||
|
{"Catherine Qi Zhao", "qzhao@umn.edu"},
|
||||||
|
{"Dan Challou", "challou@cs.umn.edu"},
|
||||||
|
{"Steven Wu", "zsw@umn.edu"},
|
||||||
|
{"Michael Steinbach", "steinbac@cs.umn.edu"},
|
||||||
|
{"Jon Weissman", "jon@cs.umn.edu"},
|
||||||
|
{"Victoria Interrante", "interran@cs.umn.edu"},
|
||||||
|
{"Shana Watters", "watt0087@umn.edu"},
|
||||||
|
{"James Parker", "jparker@cs.umn.edu"},
|
||||||
|
{"James Moen", "moen0017@cs.umn.edu"},
|
||||||
|
{"Daniel Giesel", "giese138@umn.edu"},
|
||||||
|
{"Jon Read", "readx028@umn.edu"},
|
||||||
|
{"Sara Stokowski", "stoko004@umn.edu"},
|
||||||
|
{NULL, NULL},
|
||||||
|
};
|
||||||
|
|
||||||
|
// structure to store a lookup_t. client fills in with name, server
|
||||||
|
// fills in email if found in
|
||||||
|
typedef struct {
|
||||||
|
int pid;
|
||||||
|
char name[256];
|
||||||
|
char email[256];
|
||||||
|
} lookup_t;
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
printf("starting server\n");
|
||||||
|
|
||||||
|
remove("requests.fifo");
|
||||||
|
remove("completions.fifo");
|
||||||
|
remove("data.fifo");
|
||||||
|
printf("SERVER: removed old fifos\n");
|
||||||
|
|
||||||
|
mkfifo("requests.fifo", S_IRUSR | S_IWUSR);
|
||||||
|
mkfifo("completions.fifo", S_IRUSR | S_IWUSR);
|
||||||
|
mkfifo("data.fifo", S_IRUSR | S_IWUSR);
|
||||||
|
printf("SERVER: created new fifos\n");
|
||||||
|
|
||||||
|
int requests_fd = open(
|
||||||
|
"requests.fifo", O_RDWR); // open read/write in case server hasn't started
|
||||||
|
int completions_fd =
|
||||||
|
open("completions.fifo",
|
||||||
|
O_RDWR); // open read or write only may cause hangs if the
|
||||||
|
int data_fd =
|
||||||
|
open("data.fifo", O_RDWR); // other end of the pipe has not be openened
|
||||||
|
printf("SERVER: opened FIFOs, listening\n");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
lookup_t request;
|
||||||
|
read(requests_fd, &request, sizeof(lookup_t));
|
||||||
|
printf("%d B SERVER: received request {pid=%d name=\"%s\" }\n",
|
||||||
|
request.pid, request.pid, request.name);
|
||||||
|
char *name = request.name;
|
||||||
|
int found = 0;
|
||||||
|
for (int i = 0; data[i][0] != NULL; i++) {
|
||||||
|
if (strcmp(name, data[i][0]) == 0) {
|
||||||
|
strcpy(request.email, data[i][1]);
|
||||||
|
found = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
strcpy(request.email, "NOT FOUND");
|
||||||
|
}
|
||||||
|
printf(
|
||||||
|
"%d B SERVER: filling request {pid=%d name=\"%s\" email=\"%s\" }\n",
|
||||||
|
request.pid, request.pid, request.name, request.email);
|
||||||
|
write(data_fd, &request, sizeof(request));
|
||||||
|
printf("%d B SERVER: signaling pid %d\n", request.pid, request.pid);
|
||||||
|
kill(request.pid, SIGCONT);
|
||||||
|
int done_pid = -1;
|
||||||
|
read(completions_fd, &done_pid, sizeof(int));
|
||||||
|
printf("%d E SERVER: %d completion\n", done_pid, done_pid);
|
||||||
|
if (request.pid != done_pid) {
|
||||||
|
printf("Server Problems: PID %d vs %d", request.pid, done_pid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
BIN
lab09-code/em_server_mq
Executable file
BIN
lab09-code/em_server_mq
Executable file
Binary file not shown.
93
lab09-code/em_server_mq.c
Normal file
93
lab09-code/em_server_mq.c
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
// Server code which contains a name/email pairs and will fulfill
|
||||||
|
// requests from a client through System V IPC message queues.
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/ipc.h>
|
||||||
|
#include <sys/msg.h>
|
||||||
|
|
||||||
|
// data the server has and clients want: pairings of name and email
|
||||||
|
char *data[][2] = {
|
||||||
|
{"Chris Kauffman" ,"kauffman@umn.edu"},
|
||||||
|
{"Christopher Jonathan" ,"jonat003@umn.edu"},
|
||||||
|
{"Amy Larson" ,"larson@cs.umn.edu"},
|
||||||
|
{"Chris Dovolis" ,"dovolis@cs.umn.edu"},
|
||||||
|
{"Dan Knights" ,"knights@cs.umn.edu"},
|
||||||
|
{"George Karypis" ,"karypis@cs.umn.edu"},
|
||||||
|
{"Steven Jensen" ,"sjensen@cs.umn.edu"},
|
||||||
|
{"Daniel Keefe" ,"dfk@umn.edu"},
|
||||||
|
{"Michael W. Whalen" ,"whalen@cs.umn.edu"},
|
||||||
|
{"Catherine Qi Zhao" ,"qzhao@umn.edu"},
|
||||||
|
{"Dan Challou" ,"challou@cs.umn.edu"},
|
||||||
|
{"Steven Wu" ,"zsw@umn.edu"},
|
||||||
|
{"Michael Steinbach" ,"steinbac@cs.umn.edu"},
|
||||||
|
{"Jon Weissman" ,"jon@cs.umn.edu"},
|
||||||
|
{"Victoria Interrante" ,"interran@cs.umn.edu"},
|
||||||
|
{"Shana Watters" ,"watt0087@umn.edu"},
|
||||||
|
{"James Parker" ,"jparker@cs.umn.edu"},
|
||||||
|
{"James Moen" ,"moen0017@cs.umn.edu"},
|
||||||
|
{"Daniel Giesel" ,"giese138@umn.edu"},
|
||||||
|
{"Jon Read" ,"readx028@umn.edu"},
|
||||||
|
{"Sara Stokowski" ,"stoko004@umn.edu"},
|
||||||
|
{NULL , NULL},
|
||||||
|
};
|
||||||
|
|
||||||
|
// structure to store a lookup. client fills in with name, server
|
||||||
|
// fills in email if found in
|
||||||
|
typedef struct {
|
||||||
|
long mtype; // contains PID of sending process
|
||||||
|
char name[256]; // name desired
|
||||||
|
char email[256]; // email associated with name
|
||||||
|
} lookup_t;
|
||||||
|
|
||||||
|
int signalled = 0;
|
||||||
|
void handle_signals(int sig_num){
|
||||||
|
signalled = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
struct sigaction my_sa = {}; // portable signal handling setup with sigaction()
|
||||||
|
my_sa.sa_handler = handle_signals; // run function handle_signals
|
||||||
|
sigaction(SIGTERM, &my_sa, NULL); // register SIGCONT with given action
|
||||||
|
sigaction(SIGINT, &my_sa, NULL); // register SIGCONT with given action
|
||||||
|
|
||||||
|
printf("starting server\n");
|
||||||
|
|
||||||
|
key_t key;
|
||||||
|
key = ftok("em_server_mq.c", 0);
|
||||||
|
int to_server_qid = msgget(key, 0644 | IPC_CREAT);
|
||||||
|
key = ftok("em_client_mq.c", 0);
|
||||||
|
int to_clients_qid = msgget(key, 0644 | IPC_CREAT);
|
||||||
|
|
||||||
|
printf("SERVER: created/attached to message queues\n");
|
||||||
|
|
||||||
|
while(!signalled){
|
||||||
|
lookup_t request;
|
||||||
|
msgrcv(to_server_qid, &request, sizeof(lookup_t), 0, 0);
|
||||||
|
printf("%ld B SERVER: received request {pid=%ld name=\"%s\" }\n",
|
||||||
|
request.mtype, request.mtype, request.name);
|
||||||
|
char *name = request.name;
|
||||||
|
int found = 0;
|
||||||
|
for(int i=0; data[i][0] != NULL; i++){
|
||||||
|
if(strcmp(name, data[i][0]) == 0){
|
||||||
|
strcpy(request.email, data[i][1]);
|
||||||
|
found = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found){
|
||||||
|
strcpy(request.email, "NOT FOUND");
|
||||||
|
}
|
||||||
|
printf("%ld C SERVER: filling request {pid=%ld name=\"%s\" email=\"%s\" }\n",
|
||||||
|
request.mtype,request.mtype, request.name, request.email);
|
||||||
|
|
||||||
|
msgsnd(to_clients_qid, &request, sizeof(request), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgctl(to_server_qid, IPC_RMID, NULL); // clean up the message queues
|
||||||
|
msgctl(to_clients_qid, IPC_RMID, NULL);
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
64
lab09-code/run_simulation_fifo.sh
Executable file
64
lab09-code/run_simulation_fifo.sh
Executable file
|
@ -0,0 +1,64 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# usage: run_smulations.sh 20
|
||||||
|
#
|
||||||
|
# Start an em_server then run multiple simultaneous em_clients
|
||||||
|
# connecting to find various emails. Accepts a command line argument
|
||||||
|
# which is the number of clients to run.
|
||||||
|
|
||||||
|
nclients=10
|
||||||
|
|
||||||
|
if (( $# >= 1 )); then
|
||||||
|
nclients=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
names=(
|
||||||
|
"Chris Kauffman"
|
||||||
|
"Christopher Jonathan"
|
||||||
|
"Amy Larson"
|
||||||
|
"Chris Dovolis"
|
||||||
|
"Dan Knights"
|
||||||
|
"George Karypis"
|
||||||
|
"Steven Jensen"
|
||||||
|
"Daniel Keefe"
|
||||||
|
"Michael W. Whalen"
|
||||||
|
"Catherine Qi Zhao"
|
||||||
|
"Dan Challou"
|
||||||
|
"Steven Wu"
|
||||||
|
"Michael Steinbach"
|
||||||
|
"Jon Weissman"
|
||||||
|
"Victoria Interrante"
|
||||||
|
"Shana Watters"
|
||||||
|
"James Parker"
|
||||||
|
"James Moen"
|
||||||
|
"Daniel Giesel"
|
||||||
|
"Jon Read"
|
||||||
|
"Sara Stokowski"
|
||||||
|
)
|
||||||
|
|
||||||
|
len=${#names[*]} # length of the array of names
|
||||||
|
|
||||||
|
./em_server_fifo & # start the server
|
||||||
|
em_server_pid=$!
|
||||||
|
|
||||||
|
# sleep 0.25 # short pause to ensure server starts up
|
||||||
|
|
||||||
|
nclients=$((nclients-1)) # decrement as we are starting at 0
|
||||||
|
|
||||||
|
pids=() # track em_clients pids
|
||||||
|
for i in `seq 0 $nclients`; do
|
||||||
|
idx=$((i % len)) # index of email addressfish out one emal address
|
||||||
|
email="${names[idx]}" # fish out an email address
|
||||||
|
# echo "${names[idx]}"
|
||||||
|
./em_client_fifo "$email" & # start client with email address
|
||||||
|
pids[i]=$! # keep track of pid of last process: client
|
||||||
|
done
|
||||||
|
|
||||||
|
# echo "${pids[*]}"
|
||||||
|
|
||||||
|
# wait for jobs to finish
|
||||||
|
for pid in ${pids[*]}; do # wait for all clients to finish
|
||||||
|
wait $pid
|
||||||
|
done
|
||||||
|
|
||||||
|
kill $em_server_pid # kill the server
|
64
lab09-code/run_simulation_mq.sh
Executable file
64
lab09-code/run_simulation_mq.sh
Executable file
|
@ -0,0 +1,64 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# usage: run_smulations.sh 20
|
||||||
|
#
|
||||||
|
# Start an em_server then run multiple simultaneous em_clients
|
||||||
|
# connecting to find various emails. Accepts a command line argument
|
||||||
|
# which is the number of clients to run.
|
||||||
|
|
||||||
|
nclients=10
|
||||||
|
|
||||||
|
if (( $# >= 1 )); then
|
||||||
|
nclients=$1
|
||||||
|
fi
|
||||||
|
|
||||||
|
names=(
|
||||||
|
"Chris Kauffman"
|
||||||
|
"Christopher Jonathan"
|
||||||
|
"Amy Larson"
|
||||||
|
"Chris Dovolis"
|
||||||
|
"Dan Knights"
|
||||||
|
"George Karypis"
|
||||||
|
"Steven Jensen"
|
||||||
|
"Daniel Keefe"
|
||||||
|
"Michael W. Whalen"
|
||||||
|
"Catherine Qi Zhao"
|
||||||
|
"Dan Challou"
|
||||||
|
"Steven Wu"
|
||||||
|
"Michael Steinbach"
|
||||||
|
"Jon Weissman"
|
||||||
|
"Victoria Interrante"
|
||||||
|
"Shana Watters"
|
||||||
|
"James Parker"
|
||||||
|
"James Moen"
|
||||||
|
"Daniel Giesel"
|
||||||
|
"Jon Read"
|
||||||
|
"Sara Stokowski"
|
||||||
|
)
|
||||||
|
|
||||||
|
len=${#names[*]} # length of the array of names
|
||||||
|
|
||||||
|
./em_server_mq & # start the server
|
||||||
|
em_server_pid=$!
|
||||||
|
|
||||||
|
# sleep 0.25 # short pause to ensure server starts up
|
||||||
|
|
||||||
|
nclients=$((nclients-1)) # decrement as we are starting at 0
|
||||||
|
|
||||||
|
pids=() # track em_clients pids
|
||||||
|
for i in `seq 0 $nclients`; do
|
||||||
|
idx=$((i % len)) # index of email addressfish out one emal address
|
||||||
|
email="${names[idx]}" # fish out an email address
|
||||||
|
# echo "${names[idx]}"
|
||||||
|
./em_client_mq "$email" & # start client with email address
|
||||||
|
pids[i]=$! # keep track of pid of last process: client
|
||||||
|
done
|
||||||
|
|
||||||
|
# echo "${pids[*]}"
|
||||||
|
|
||||||
|
# wait for jobs to finish
|
||||||
|
for pid in ${pids[*]}; do # wait for all clients to finish
|
||||||
|
wait $pid
|
||||||
|
done
|
||||||
|
|
||||||
|
kill $em_server_pid # kill the server
|
BIN
lab10-code.zip
Normal file
BIN
lab10-code.zip
Normal file
Binary file not shown.
3
lab10-code/.gdb_history
Normal file
3
lab10-code/.gdb_history
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
run
|
||||||
|
bt
|
||||||
|
q
|
6
lab10-code/.vscode/settings.json
vendored
Normal file
6
lab10-code/.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"*.pyx": "python",
|
||||||
|
"string.h": "c"
|
||||||
|
}
|
||||||
|
}
|
16
lab10-code/Makefile
Normal file
16
lab10-code/Makefile
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
CFLAGS = -Wall -g
|
||||||
|
CC = gcc $(CFLAGS)
|
||||||
|
|
||||||
|
all : philosophers_ipc philosophers_pthread
|
||||||
|
|
||||||
|
philosophers_ipc : philosophers_ipc.c
|
||||||
|
$(CC) -o $@ $^
|
||||||
|
|
||||||
|
philosophers_pthread: philosophers_pthread.c
|
||||||
|
$(CC) -pthread -o $@ $^
|
||||||
|
|
||||||
|
clean :
|
||||||
|
rm -f *.o philosophers_ipc # philosophers_pthread
|
||||||
|
|
||||||
|
|
||||||
|
|
1
lab10-code/peda-session-philosophers_pthread.txt
Normal file
1
lab10-code/peda-session-philosophers_pthread.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
|
BIN
lab10-code/philosophers_ipc
Executable file
BIN
lab10-code/philosophers_ipc
Executable file
Binary file not shown.
130
lab10-code/philosophers_ipc.c
Normal file
130
lab10-code/philosophers_ipc.c
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
// Dining philosophers (swansons) using System V Semaphores
|
||||||
|
// Original: http://www.lisha.ufsc.br/~guto/teaching/os/exercise/phil.html
|
||||||
|
// Modified by Chris Kauffman
|
||||||
|
//
|
||||||
|
// This version uses a C array of semaphores. Each System V semaphore
|
||||||
|
// itself can be an array but of the 5 distinct semphores in the C array are
|
||||||
|
// initialized to contain only a single counter at sem_num=0.
|
||||||
|
//
|
||||||
|
// Short random delays are added between each philosophers
|
||||||
|
// thinking/eating cycle to generate some variance in execution order
|
||||||
|
//
|
||||||
|
// To see the multiple processes, run the following commands
|
||||||
|
// > gcc -o philosophers philosophers.c
|
||||||
|
// > philosophers > xxx & watch -d -n 0.1 'ps ux | grep philosophers'
|
||||||
|
// Ctrl-c to stop the "watch" command (may screw up the terminal display)
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/ipc.h>
|
||||||
|
#include <sys/sem.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define N_PHILOSOPHERS 5 // Number of philosophers
|
||||||
|
|
||||||
|
const int MEALS_TO_FINISH =
|
||||||
|
10; // Number of iterations before philosophers finish
|
||||||
|
const int MAX_DELAY = 50000; // Maximum delay in nanos between meal iterations
|
||||||
|
|
||||||
|
// Semaphore ids
|
||||||
|
int utensils[N_PHILOSOPHERS]; // IDs for arrays of IPC semaphores
|
||||||
|
|
||||||
|
int philosopher(int n); // Defined after main()
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
int i, status;
|
||||||
|
pid_t phil[N_PHILOSOPHERS];
|
||||||
|
printf("The Dining Swansons (Philosophers) Problem\n");
|
||||||
|
|
||||||
|
// Parent process only:
|
||||||
|
//
|
||||||
|
// Allocate utensils: semaphores which are initially set to value
|
||||||
|
// one. Each semaphore is only a single counter with sem_num=0.
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
utensils[i] = semget(IPC_PRIVATE, 1, IPC_CREAT | 0600);
|
||||||
|
semctl(utensils[i], 0, SETVAL, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parent generates child processes
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
int pid = fork();
|
||||||
|
if (pid == 0) { // child has pid 0
|
||||||
|
int ret = philosopher(i); // child acts as philosopher
|
||||||
|
exit(ret); // then exits
|
||||||
|
} else { // parent gets pid > 0
|
||||||
|
phil[i] = pid; // parent tracks children
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parent waits on all children to finish
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
waitpid(phil[i], &status, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("JJ: All Swansons finished, cleaning up the diner\n");
|
||||||
|
|
||||||
|
// Eliminate the utensils and table semaphores
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
semctl(utensils[i], 0, IPC_RMID, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code for dining philosopher child processes
|
||||||
|
int philosopher(int n) {
|
||||||
|
int i, first, second;
|
||||||
|
struct sembuf op; // Used to perform semaphore operations
|
||||||
|
op.sem_flg = 0;
|
||||||
|
op.sem_num =
|
||||||
|
0; // C array of semaphores each with 1, op always on the 0th sem
|
||||||
|
srand(time(NULL)); // Seed random number generator
|
||||||
|
|
||||||
|
// Avoid deadlock via slightly different order of utensil requests
|
||||||
|
// for last philospher
|
||||||
|
|
||||||
|
// first utensil to get, most go for n first, last philospher goes for 0
|
||||||
|
// first
|
||||||
|
first = (n != N_PHILOSOPHERS - 1) ? n : 0;
|
||||||
|
// second utensil to get, last philopher goes for n second
|
||||||
|
second = (n != N_PHILOSOPHERS - 1) ? n + 1 : n;
|
||||||
|
|
||||||
|
printf("Swanson %d wants utensils %d and %d\n", n, first, second);
|
||||||
|
printf("Swanson %d at the table\n", n);
|
||||||
|
|
||||||
|
// Main loop of thinking/eating cycles
|
||||||
|
for (i = 0; i < MEALS_TO_FINISH; i++) {
|
||||||
|
int sleep_time = rand() % MAX_DELAY;
|
||||||
|
usleep(sleep_time); // sleep for for a short time
|
||||||
|
|
||||||
|
printf("%2d: Swanson %d is contemplating his awesomeness ...\n", i, n);
|
||||||
|
|
||||||
|
// get first utensil
|
||||||
|
op.sem_op = -1;
|
||||||
|
semop(utensils[first], &op, 1);
|
||||||
|
printf("%2d: Swanson %d got utensil %d\n", i, n, first);
|
||||||
|
|
||||||
|
// get second utensil
|
||||||
|
op.sem_op = -1;
|
||||||
|
semop(utensils[second], &op, 1);
|
||||||
|
printf("%2d: Swanson %d got utensil %d\n", i, n, second);
|
||||||
|
|
||||||
|
printf("%2d: Swanson %d is eating an egg ...\n", i, n);
|
||||||
|
usleep(sleep_time); // sleep for for a short time
|
||||||
|
|
||||||
|
// release first utensil
|
||||||
|
op.sem_op = +1;
|
||||||
|
semop(utensils[first], &op, 1);
|
||||||
|
|
||||||
|
// release second utensil
|
||||||
|
op.sem_op = +1;
|
||||||
|
semop(utensils[second], &op, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Swanson %d leaving the diner\n", n);
|
||||||
|
exit(n);
|
||||||
|
}
|
BIN
lab10-code/philosophers_pthread
Executable file
BIN
lab10-code/philosophers_pthread
Executable file
Binary file not shown.
108
lab10-code/philosophers_pthread.c
Normal file
108
lab10-code/philosophers_pthread.c
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
// MODIFY THIS FILE to use pthreads rather than IPC. Lines marked with
|
||||||
|
// **CHANGE** indicate lines that are higly likely to need alterations.
|
||||||
|
#include <error.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/sem.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define N_PHILOSOPHERS 5 // Number of philosophers
|
||||||
|
|
||||||
|
const int MEALS_TO_FINISH = 2; // Number of iterations before finish
|
||||||
|
const int MAX_DELAY = 50000; // Maximum delay in nanos between meal iterations
|
||||||
|
|
||||||
|
pthread_mutex_t utensils[N_PHILOSOPHERS];
|
||||||
|
|
||||||
|
void *philosopher(void *n);
|
||||||
|
// **CHANGE** to have prototype compatible with thread entry points
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
int i, status;
|
||||||
|
pthread_t phil[N_PHILOSOPHERS];
|
||||||
|
printf("The Dining Swansons (Philosophers) Problem\n");
|
||||||
|
|
||||||
|
// Parent thread only:
|
||||||
|
//
|
||||||
|
// Allocate utensils: mutexes
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
pthread_mutex_init(&utensils[i], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parent generates child processes
|
||||||
|
int numbers[N_PHILOSOPHERS];
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
numbers[i] = i; // workaround for wrong numbers
|
||||||
|
status = pthread_create(&phil[i], NULL, &philosopher, &numbers[i]);
|
||||||
|
if (status) {
|
||||||
|
fprintf(stderr, "Could not create thread: %s\n", strerror(status));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parent waits on all children to finish
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
pthread_join(phil[i], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("JJ: All Swansons finished, cleaning up the diner\n");
|
||||||
|
|
||||||
|
// Eliminate the utensils and table semaphores
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
pthread_mutex_destroy(&utensils[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code for dining philosopher child processes
|
||||||
|
void *philosopher(void *arg) {
|
||||||
|
int n = *(int *)arg;
|
||||||
|
int i, first, second;
|
||||||
|
srand(time(NULL)); // Seed random number generator
|
||||||
|
|
||||||
|
// Avoid deadlock via slightly different order of utensil requests
|
||||||
|
// for last philospher
|
||||||
|
|
||||||
|
// first utensil to get, most go for n first, last philospher goes for 0
|
||||||
|
// first
|
||||||
|
first = (n != N_PHILOSOPHERS - 1) ? n : 0;
|
||||||
|
// second utensil to get, last philopher goes for n second
|
||||||
|
second = (n != N_PHILOSOPHERS - 1) ? n + 1 : n;
|
||||||
|
|
||||||
|
printf("Swanson %d wants utensils %d and %d\n", n, first, second);
|
||||||
|
printf("Swanson %d at the table\n", n);
|
||||||
|
|
||||||
|
// Main loop of thinking/eating cycles
|
||||||
|
for (i = 0; i < MEALS_TO_FINISH; i++) {
|
||||||
|
int sleep_time = rand() % MAX_DELAY;
|
||||||
|
usleep(sleep_time); // sleep for for a short time
|
||||||
|
|
||||||
|
printf("%2d: Swanson %d is contemplating his awesomeness ...\n", i, n);
|
||||||
|
|
||||||
|
// get first utensil
|
||||||
|
pthread_mutex_lock(&utensils[first]);
|
||||||
|
printf("%2d: Swanson %d got utensil %d\n", i, n, first);
|
||||||
|
|
||||||
|
// get second utensil
|
||||||
|
pthread_mutex_lock(&utensils[second]);
|
||||||
|
printf("%2d: Swanson %d got utensil %d\n", i, n, second);
|
||||||
|
|
||||||
|
printf("%2d: Swanson %d is eating an egg ...\n", i, n);
|
||||||
|
usleep(sleep_time); // sleep for for a short time
|
||||||
|
|
||||||
|
// release first utensil
|
||||||
|
pthread_mutex_unlock(&utensils[first]);
|
||||||
|
|
||||||
|
// release second utensil
|
||||||
|
pthread_mutex_unlock(&utensils[second]);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Swanson %d leaving the diner\n", n);
|
||||||
|
return NULL;
|
||||||
|
}
|
108
lab10-code/philosophers_pthread.txt
Normal file
108
lab10-code/philosophers_pthread.txt
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
// MODIFY THIS FILE to use pthreads rather than IPC. Lines marked with
|
||||||
|
// **CHANGE** indicate lines that are higly likely to need alterations.
|
||||||
|
#include <error.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/sem.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define N_PHILOSOPHERS 5 // Number of philosophers
|
||||||
|
|
||||||
|
const int MEALS_TO_FINISH = 2; // Number of iterations before finish
|
||||||
|
const int MAX_DELAY = 50000; // Maximum delay in nanos between meal iterations
|
||||||
|
|
||||||
|
pthread_mutex_t utensils[N_PHILOSOPHERS];
|
||||||
|
|
||||||
|
void *philosopher(void *n);
|
||||||
|
// **CHANGE** to have prototype compatible with thread entry points
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
int i, status;
|
||||||
|
pthread_t phil[N_PHILOSOPHERS];
|
||||||
|
printf("The Dining Swansons (Philosophers) Problem\n");
|
||||||
|
|
||||||
|
// Parent thread only:
|
||||||
|
//
|
||||||
|
// Allocate utensils: mutexes
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
pthread_mutex_init(&utensils[i], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parent generates child processes
|
||||||
|
int numbers[N_PHILOSOPHERS];
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
numbers[i] = i; // workaround for wrong numbers
|
||||||
|
status = pthread_create(&phil[i], NULL, &philosopher, &numbers[i]);
|
||||||
|
if (status) {
|
||||||
|
fprintf(stderr, "Could not create thread: %s\n", strerror(status));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parent waits on all children to finish
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
pthread_join(phil[i], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("JJ: All Swansons finished, cleaning up the diner\n");
|
||||||
|
|
||||||
|
// Eliminate the utensils and table semaphores
|
||||||
|
for (i = 0; i < N_PHILOSOPHERS; i++) {
|
||||||
|
pthread_mutex_destroy(&utensils[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code for dining philosopher child processes
|
||||||
|
void *philosopher(void *arg) {
|
||||||
|
int n = *(int *)arg;
|
||||||
|
int i, first, second;
|
||||||
|
srand(time(NULL)); // Seed random number generator
|
||||||
|
|
||||||
|
// Avoid deadlock via slightly different order of utensil requests
|
||||||
|
// for last philospher
|
||||||
|
|
||||||
|
// first utensil to get, most go for n first, last philospher goes for 0
|
||||||
|
// first
|
||||||
|
first = (n != N_PHILOSOPHERS - 1) ? n : 0;
|
||||||
|
// second utensil to get, last philopher goes for n second
|
||||||
|
second = (n != N_PHILOSOPHERS - 1) ? n + 1 : n;
|
||||||
|
|
||||||
|
printf("Swanson %d wants utensils %d and %d\n", n, first, second);
|
||||||
|
printf("Swanson %d at the table\n", n);
|
||||||
|
|
||||||
|
// Main loop of thinking/eating cycles
|
||||||
|
for (i = 0; i < MEALS_TO_FINISH; i++) {
|
||||||
|
int sleep_time = rand() % MAX_DELAY;
|
||||||
|
usleep(sleep_time); // sleep for for a short time
|
||||||
|
|
||||||
|
printf("%2d: Swanson %d is contemplating his awesomeness ...\n", i, n);
|
||||||
|
|
||||||
|
// get first utensil
|
||||||
|
pthread_mutex_lock(&utensils[first]);
|
||||||
|
printf("%2d: Swanson %d got utensil %d\n", i, n, first);
|
||||||
|
|
||||||
|
// get second utensil
|
||||||
|
pthread_mutex_lock(&utensils[second]);
|
||||||
|
printf("%2d: Swanson %d got utensil %d\n", i, n, second);
|
||||||
|
|
||||||
|
printf("%2d: Swanson %d is eating an egg ...\n", i, n);
|
||||||
|
usleep(sleep_time); // sleep for for a short time
|
||||||
|
|
||||||
|
// release first utensil
|
||||||
|
pthread_mutex_unlock(&utensils[first]);
|
||||||
|
|
||||||
|
// release second utensil
|
||||||
|
pthread_mutex_unlock(&utensils[second]);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Swanson %d leaving the diner\n", n);
|
||||||
|
return NULL;
|
||||||
|
}
|
60
lab10-code/pthreads_picalc_mutex.c
Normal file
60
lab10-code/pthreads_picalc_mutex.c
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
// Working version of threaded picalc. Uses a mutex to lock the global
|
||||||
|
// variable total_hits so that one thread accesses it at a time. This
|
||||||
|
// version is inefficient due to the busy waiting and contention
|
||||||
|
// associated with mutex locking.
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
// Global variables shared by all threads
|
||||||
|
int total_hits=0;
|
||||||
|
int points_per_thread = -1;
|
||||||
|
pthread_mutex_t lock;
|
||||||
|
|
||||||
|
void *compute_pi(void *arg){
|
||||||
|
long thread_id = (long) arg;
|
||||||
|
unsigned int rstate = 123456789 * thread_id; // give each thread its own starting point
|
||||||
|
for (int i = 0; i < points_per_thread; i++) {
|
||||||
|
double x = ((double) rand_r(&rstate)) / ((double) RAND_MAX);
|
||||||
|
double y = ((double) rand_r(&rstate)) / ((double) RAND_MAX);
|
||||||
|
if (x*x + y*y <= 1.0){
|
||||||
|
pthread_mutex_lock(&lock); // lock global variable
|
||||||
|
total_hits++; // update
|
||||||
|
pthread_mutex_unlock(&lock); // unlock global variable
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
if(argc < 2){
|
||||||
|
printf("usage: %s <num_samples> [num_threads]\n",argv[0]);
|
||||||
|
printf(" num_samples: int, how many sample points to try, higher gets closer to pi\n");
|
||||||
|
printf(" num_threads: int, number of threads to use for the computation, default 4\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int npoints = atoi(argv[1]); // number of samples
|
||||||
|
int num_threads = argc>2 ? atoi(argv[2]) : 4; // number of threads
|
||||||
|
|
||||||
|
points_per_thread = npoints / num_threads; // init global variables
|
||||||
|
pthread_mutex_init(&lock, NULL); // create a lock
|
||||||
|
|
||||||
|
pthread_t threads[num_threads]; // track each thread
|
||||||
|
|
||||||
|
for(long p=0; p<num_threads; p++){ // launch each thread
|
||||||
|
pthread_create(&threads[p],NULL,compute_pi, (void *) (p+1));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int p=0; p<num_threads; p++){ // wait for each thread to finish
|
||||||
|
pthread_join(threads[p], (void **) NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_destroy(&lock); // get rid of the lock
|
||||||
|
|
||||||
|
double pi_est = ((double)total_hits) / npoints * 4.0;
|
||||||
|
printf("npoints: %8d\n",npoints);
|
||||||
|
printf("hits: %8d\n",total_hits);
|
||||||
|
printf("pi_est: %f\n",pi_est);
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue