diff --git a/.gitignore b/.gitignore index 6dd29b7f8d0522b9938dbcdf54dbfaea43ffc2f1..50b56319a5d3428e2d67caf5bc5543bb195d11ad 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -bin/ \ No newline at end of file +bin/ +node_modules/ diff --git a/Makefile b/Makefile index 4b98c5c745f010e864e56940eb1e773659e918df..3a62bb42b3b6b5165114500594d2617f3867cb1b 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ OUT = bin # $^ := dependencie list # $< := first item in dependencies list -all: $(OUT) $(BINS:%=$(OUT)/%) +all: $(OUT) $(BINS:%=$(OUT)/%) Zettel.html $(OUT): mkdir -p $(OUT) @@ -23,6 +23,9 @@ $(OUT)/%: %.c $(OUT)/%.o: %.c $(CC) -c -o $@ $< $(CFLAGS) +Zettel.html: Zettel.md + ./make-Zettel.js -m Readme.md -o $@ $< + $(OUT)/threadpool: threadpool.c $(OUT)/jbuffer.o $(OUT)/sem.o $(CC) -pthread -o $@ $^ $(CFLAGS) @@ -33,6 +36,6 @@ $(OUT)/sem.o: sem.h clean: - rm -rf $(OUT) + rm -rf $(OUT) Zettel.html Readme.md .PHONY: all clean diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000000000000000000000000000000000000..dac0c428b61f6893681ca5a2bb6bbf1bb8102565 --- /dev/null +++ b/Readme.md @@ -0,0 +1,139 @@ +# Code + +## reading / handling strings +printf formats + +fgets -> sscanf + +strncmp + +## parallel processing +fork exec + +### pthread + + +## networking +### client +getaddrinfo +connect + +### server +listen +accept + +<!-- include (accept.c lang=c) --> +```c +# include "die.h" +# include <netdb.h> +# include <sys/socket.h> +# include <unistd.h> +# include <signal.h> +# include <stdio.h> +# include <stdlib.h> + +static void handleConnection(int clientSock, int listenSock); +static void handleRequest(FILE *rx, FILE *tx); + +// Initialisiert den Server und nimmt Anfragen an +static void initServer(short unsigned int port) { + //ignore SIGPIPE + struct sigaction sa; + sa.sa_handler = SIG_IGN; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + + if( sigaction(SIGPIPE, &sa, NULL) != 0 ) die("Could not set sigaction"); + + //init accept + int listenSock = socket(AF_INET6, SOCK_STREAM, 0); + if ( listenSock == -1 ) die("Fehler beim Aufbau des Servers"); + struct sockaddr_in6 addr = { + .sin6_family = AF_INET6, + .sin6_port = htons(port), + .sin6_addr = in6addr_any, + }; + if ( bind(listenSock, (struct sockaddr *) &addr, sizeof(addr)) != 0 ) die("Fehler beim Aufbau des Servers"); + if ( listen(listenSock, SOMAXCONN) != 0 ) die("Fehler beim Aufbau des Servers"); + + while ( 1 ) { + int clientSock = accept(listenSock, NULL, NULL); + if ( clientSock == -1 ) { perror("Warnung: Client konnte nicht akzeptiert werden."); continue; } + handleConnection(clientSock, listenSock); + } +} + + + +static void handleConnection(int clientSock, int listenSock) { + //if pthread just bbput + + //fork() + pid_t pid; + if( (pid = fork()) == -1 ) die("fork"); + if(pid != 0) {//parent process + close(clientSock);//only in parent process + return; + } + if( close(listenSock) ) perror("close listenSock"); + + //open file streams + FILE *rx, *tx; + int clientSock_Copy = dup(clientSock); + if(clientSock_Copy < 0) die("dup"); + + if( (rx = fdopen(clientSock, "r")) == NULL) die("fdopen"); + if( (tx = fdopen(clientSock_Copy, "w")) == NULL) die("fdopen"); + + //handleRequest() + handleRequest(rx, tx); + + //close connection + if( fclose(rx) ) die("fclose rx"); + if( fclose(tx) ) die("fclose tx"); + + //exit + exit(EXIT_SUCCESS);//child exits +} + +static void handleRequest(FILE *rx, FILE *tx) { + rx = (FILE *) rx; + fprintf(tx, "hi\n"); +} + +int main() { + initServer(2020); +} +``` +<!-- /include --> + +## open File + +<!-- include (fopen.c lang=c) --> +```c +# include "die.h" +# include <stdio.h> + +int main() { + FILE* file = fopen("../fopen.c", "w"); + if ( file == NULL ) die("Fehler bei der Anpassung der Standardeingabe"); + + //do stuff + + if (fclose(file)) perror("failed to save file");//errorhandling optional +} +``` +<!-- /include --> + + +# RAID +* RAID 0 : Daten werden ¨uber mehrere Platten gespeichert + keinerlei Datensicherung: Ausfall einer Platte l¨asst Gesamtsystem ausfallen +* RAID 1 : Daten werden auf zwei Platten gleichzeitig gespeichert + eine Platte kann ausfallen, aber doppelter Speicherbedarf +* RAID 4 : Daten werden ¨uber mehrere Platten gespeichert, eine enthält Parität + Paritätsblock aus byteweisen XOR-Verknüpfungen, + eine Platte kann ausfallen, prinzipiell beliebige Plattenanzahl (ab 3) + Nachteil: Paritätsplatte hoch belastet +* RAID 5 : Paritätsblock wird über alle Platten verstreut +* RAID 6 : doppelte Paritätsblöcke diff --git a/Zettel.html b/Zettel.html new file mode 100644 index 0000000000000000000000000000000000000000..c564ffdd547e1aeb03d1ff6503b416780d1d943f --- /dev/null +++ b/Zettel.html @@ -0,0 +1,126 @@ +<link rel="stylesheet" href="node_modules/highlight.js/styles/default.css"><h1>Code</h1> +<h2>reading / handling strings</h2> +<p>printf formats</p> +<p>fgets -> sscanf</p> +<p>strncmp</p> +<h2>parallel processing</h2> +<p>fork exec</p> +<h3>pthread</h3> +<h2>networking</h2> +<h3>client</h3> +<p>getaddrinfo +connect</p> +<h3>server</h3> +<p>listen +accept</p> +<p><!-- include (accept.c lang=c) --></p> +<pre><code class="hljs language-c"><span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">"die.h"</span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><netdb.h></span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><sys/socket.h></span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><unistd.h></span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><signal.h></span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><stdio.h></span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><stdlib.h></span></span> + +<span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleConnection</span><span class="hljs-params">(<span class="hljs-keyword">int</span> clientSock, <span class="hljs-keyword">int</span> listenSock)</span></span>; +<span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleRequest</span><span class="hljs-params">(FILE *rx, FILE *tx)</span></span>; + +<span class="hljs-comment">// Initialisiert den Server und nimmt Anfragen an</span> +<span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">initServer</span><span class="hljs-params">(short <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">int</span> port)</span> </span>{ + <span class="hljs-comment">//ignore SIGPIPE</span> + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">sigaction</span> <span class="hljs-title">sa</span>;</span> + sa.sa_handler = SIG_IGN; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + + <span class="hljs-keyword">if</span>( sigaction(SIGPIPE, &sa, <span class="hljs-literal">NULL</span>) != <span class="hljs-number">0</span> ) die(<span class="hljs-string">"Could not set sigaction"</span>); + + <span class="hljs-comment">//init accept</span> + <span class="hljs-keyword">int</span> listenSock = socket(AF_INET6, SOCK_STREAM, <span class="hljs-number">0</span>); + <span class="hljs-keyword">if</span> ( listenSock == <span class="hljs-number">-1</span> ) die(<span class="hljs-string">"Fehler beim Aufbau des Servers"</span>); + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">sockaddr_in6</span> <span class="hljs-title">addr</span> = {</span> + .sin6_family = AF_INET6, + .sin6_port = htons(port), + .sin6_addr = in6addr_any, + }; + <span class="hljs-keyword">if</span> ( bind(listenSock, (struct sockaddr *) &addr, <span class="hljs-keyword">sizeof</span>(addr)) != <span class="hljs-number">0</span> ) die(<span class="hljs-string">"Fehler beim Aufbau des Servers"</span>); + <span class="hljs-keyword">if</span> ( <span class="hljs-built_in">listen</span>(listenSock, SOMAXCONN) != <span class="hljs-number">0</span> ) die(<span class="hljs-string">"Fehler beim Aufbau des Servers"</span>); + + <span class="hljs-keyword">while</span> ( <span class="hljs-number">1</span> ) { + <span class="hljs-keyword">int</span> clientSock = accept(listenSock, <span class="hljs-literal">NULL</span>, <span class="hljs-literal">NULL</span>); + <span class="hljs-keyword">if</span> ( clientSock == <span class="hljs-number">-1</span> ) { perror(<span class="hljs-string">"Warnung: Client konnte nicht akzeptiert werden."</span>); <span class="hljs-keyword">continue</span>; } + handleConnection(clientSock, listenSock); + } +} + + + +<span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleConnection</span><span class="hljs-params">(<span class="hljs-keyword">int</span> clientSock, <span class="hljs-keyword">int</span> listenSock)</span> </span>{ + <span class="hljs-comment">//if pthread just bbput</span> + + <span class="hljs-comment">//fork()</span> + <span class="hljs-keyword">pid_t</span> pid; + <span class="hljs-keyword">if</span>( (pid = fork()) == <span class="hljs-number">-1</span> ) die(<span class="hljs-string">"fork"</span>); + <span class="hljs-keyword">if</span>(pid != <span class="hljs-number">0</span>) {<span class="hljs-comment">//parent process</span> + <span class="hljs-built_in">close</span>(clientSock);<span class="hljs-comment">//only in parent process</span> + <span class="hljs-keyword">return</span>; + } + <span class="hljs-keyword">if</span>( <span class="hljs-built_in">close</span>(listenSock) ) perror(<span class="hljs-string">"close listenSock"</span>); + + <span class="hljs-comment">//open file streams</span> + FILE *rx, *tx; + <span class="hljs-keyword">int</span> clientSock_Copy = dup(clientSock); + <span class="hljs-keyword">if</span>(clientSock_Copy < <span class="hljs-number">0</span>) die(<span class="hljs-string">"dup"</span>); + + <span class="hljs-keyword">if</span>( (rx = fdopen(clientSock, <span class="hljs-string">"r"</span>)) == <span class="hljs-literal">NULL</span>) die(<span class="hljs-string">"fdopen"</span>); + <span class="hljs-keyword">if</span>( (tx = fdopen(clientSock_Copy, <span class="hljs-string">"w"</span>)) == <span class="hljs-literal">NULL</span>) die(<span class="hljs-string">"fdopen"</span>); + + <span class="hljs-comment">//handleRequest()</span> + handleRequest(rx, tx); + + <span class="hljs-comment">//close connection</span> + <span class="hljs-keyword">if</span>( fclose(rx) ) die(<span class="hljs-string">"fclose rx"</span>); + <span class="hljs-keyword">if</span>( fclose(tx) ) die(<span class="hljs-string">"fclose tx"</span>); + + <span class="hljs-comment">//exit</span> + <span class="hljs-built_in">exit</span>(EXIT_SUCCESS);<span class="hljs-comment">//child exits</span> +} + +<span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">handleRequest</span><span class="hljs-params">(FILE *rx, FILE *tx)</span> </span>{ + rx = (FILE *) rx; + <span class="hljs-built_in">fprintf</span>(tx, <span class="hljs-string">"hi\n"</span>); +} + +<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{ + initServer(<span class="hljs-number">2020</span>); +} +</code></pre> +<p><!-- /include --></p> +<h2>open File</h2> +<p><!-- include (fopen.c lang=c) --></p> +<pre><code class="hljs language-c"><span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">"die.h"</span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><stdio.h></span></span> + +<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{ + FILE* file = fopen(<span class="hljs-string">"../fopen.c"</span>, <span class="hljs-string">"w"</span>); + <span class="hljs-keyword">if</span> ( file == <span class="hljs-literal">NULL</span> ) die(<span class="hljs-string">"Fehler bei der Anpassung der Standardeingabe"</span>); + + <span class="hljs-comment">//do stuff</span> + + <span class="hljs-keyword">if</span> (fclose(file)) perror(<span class="hljs-string">"failed to save file"</span>);<span class="hljs-comment">//errorhandling optional</span> +} +</code></pre> +<p><!-- /include --></p> +<h1>RAID</h1> +<ul> +<li>RAID 0 : Daten werden ¨uber mehrere Platten gespeichert +keinerlei Datensicherung: Ausfall einer Platte l¨asst Gesamtsystem ausfallen</li> +<li>RAID 1 : Daten werden auf zwei Platten gleichzeitig gespeichert +eine Platte kann ausfallen, aber doppelter Speicherbedarf</li> +<li>RAID 4 : Daten werden ¨uber mehrere Platten gespeichert, eine enthält Parität +Paritätsblock aus byteweisen XOR-Verknüpfungen, +eine Platte kann ausfallen, prinzipiell beliebige Plattenanzahl (ab 3) +Nachteil: Paritätsplatte hoch belastet</li> +<li>RAID 5 : Paritätsblock wird über alle Platten verstreut</li> +<li>RAID 6 : doppelte Paritätsblöcke</li> +</ul> diff --git a/Zettel.md b/Zettel.md index dee42f8dbfe5cd09ceae8c76a2610b54ee0c5690..02f82921a1bd7c0d32b8b071e4feb4604589bbf2 100644 --- a/Zettel.md +++ b/Zettel.md @@ -14,14 +14,20 @@ fork exec ## networking +### client getaddrinfo connect +### server listen accept +!include(accept.c lang=c) + ## open File +!include(fopen.c lang=c) + # RAID * RAID 0 : Daten werden ¨uber mehrere Platten gespeichert diff --git a/accept.c b/accept.c index 2cf9fb439ead0f027de7d3c16e31143515e538fb..117013df4bc25b99b9ba9962eb24b9d4a4197d6b 100644 --- a/accept.c +++ b/accept.c @@ -77,4 +77,4 @@ static void handleRequest(FILE *rx, FILE *tx) { int main() { initServer(2020); -} \ No newline at end of file +} diff --git a/fopen.c b/fopen.c new file mode 100644 index 0000000000000000000000000000000000000000..374da72be67056f45f87ac9280c4d834e44593db --- /dev/null +++ b/fopen.c @@ -0,0 +1,11 @@ +#include "die.h" +#include <stdio.h> + +int main() { + FILE* file = fopen("../fopen.c", "w"); + if ( file == NULL ) die("Fehler bei der Anpassung der Standardeingabe"); + + //do stuff + + if (fclose(file)) perror("failed to save file");//errorhandling optional +} diff --git a/make-Zettel.js b/make-Zettel.js new file mode 100644 index 0000000000000000000000000000000000000000..5ee78ca9daf1c1b3c5b60f163cea9f1f003408f4 --- /dev/null +++ b/make-Zettel.js @@ -0,0 +1,77 @@ +#!/usr/bin/env node +const fs = require('fs'); +const markedpp = require('markedpp'); +const markdownit = require('markdown-it')(); + +markdownit.use(require('markdown-it-highlightjs')); + +let name = process.argv[1]; +let outfile; +let infile; +let preprocessorOutfile; + +//parse params +for(let i=2; i < process.argv.length; i++) { + switch (process.argv[i]) { + case '-o': + i++ + if(i >= process.argv.length) { + console.error("-o expected out file"); + return -1; + } + outfile = process.argv[i]; + break; + + case '-m': + i++ + if(i >= process.argv.length) { + console.error("-m expected preprocessed md out file"); + return -1; + } + preprocessorOutfile = process.argv[i]; + break; + + case '-h': + console.log("usage: " + name + " -o <outfile> [-m <preprocessor outfile>] <infile>"); + break; + + default: + if(i == process.argv.length - 1) { + infile = process.argv[i]; + } else { + console.error("unknown argument: " + process.argv[i]); + } + break; + } +} + +//check required params +if(!outfile) { + console.error("missing param outfile") + return -1; +} +if(!infile) { + console.error("missing param infile") + return -1; +} + + +fs.readFile(infile, {encoding: 'utf-8'}, (err, data) => { + //markdown preprocessor + markedpp(data, (err, result) => { + if(err) { + console.log(err); + } else { + if(preprocessorOutfile) { + fs.writeFileSync(preprocessorOutfile, result); + } + //markdown-it + let html = '<link rel="stylesheet" href="node_modules/highlight.js/styles/default.css">'; + html += markdownit.render(result); + + fs.writeFileSync(outfile, html); + } + }); +}); + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..d8b1b90bc1c826d76973231ab65c743c8989ab07 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,98 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asyncc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/asyncc/-/asyncc-2.0.4.tgz", + "integrity": "sha512-5ohHLrRC6ZJ7ypVlJh3XJlINBdErz7VeQnNNLXq2T9hVsph58x49oykgg+KNbpnOiMF0X2vDmR2i2LVtWBL7Mw==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + }, + "highlight.js": { + "version": "9.18.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz", + "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==" + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdown-it-highlightjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-highlightjs/-/markdown-it-highlightjs-3.0.0.tgz", + "integrity": "sha1-7T3WGcormOa/IRLRY79EQEM0AhA=", + "requires": { + "highlight.js": "^9.9.0", + "lodash.flow": "^3.1.0" + } + }, + "markedpp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/markedpp/-/markedpp-1.0.1.tgz", + "integrity": "sha512-nOebIjpw0YYIy+KE+vUOoW3gBVspiRjBPvHv+vqkCZAyURkVaI3aR3cVvZRZxAlZI8SrhsyFG5gBvVOCirRz9A==", + "requires": { + "asyncc": "^2.0.3", + "emoji-regex": "^8.0.0", + "html-entities": "^1.2.1" + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + } + } +}