consolidate all repos to one for archive
This commit is contained in:
17
semester_2/uvod_v_operacijske_sisteme/naloga_09/Makefile
Normal file
17
semester_2/uvod_v_operacijske_sisteme/naloga_09/Makefile
Normal file
@@ -0,0 +1,17 @@
|
||||
all: naloga_1 naloga_2 naloga_3
|
||||
|
||||
naloga_1: naloga_1.c
|
||||
gcc naloga_1.c -o naloga_1
|
||||
|
||||
naloga_2: naloga_2.c
|
||||
gcc naloga_2.c -o naloga_2
|
||||
|
||||
naloga_3: naloga_3.c
|
||||
gcc naloga_3.c -o naloga_3
|
||||
|
||||
zip:
|
||||
rm -f naloga.zip
|
||||
zip -r naloga.zip ./
|
||||
|
||||
clean:
|
||||
rm -f naloga_1 naloga_2 naloga_3
|
48
semester_2/uvod_v_operacijske_sisteme/naloga_09/README.md
Normal file
48
semester_2/uvod_v_operacijske_sisteme/naloga_09/README.md
Normal file
@@ -0,0 +1,48 @@
|
||||
Ustvarjanje procesa (sprotna naloga)
|
||||
|
||||
V sklopu te naloge demonstrirajte uporabo klicev za ustvarjanje procesov in zaganjanje programov. Pripravite 3 programe, ki izvedejo v nadaljevanju opisane naloge. Pripravite tudi Makefile, ki bo vašo kodo prevedel v izvedljive programe.
|
||||
|
||||
Posamezni naslovi podnalog v nadaljevanu so sestavljeni iz pričakovanega imena programa in pričakovanega imena izvorne zbirke. Na sistem oddajte .zip paket z Makefile skripto in izvornimi zbirkami. Bodite pozorni na poimenovanja. Pred oddajo preverite delovanje z avtomatskim preizkusom.
|
||||
naloga_1 (naloga_1.c)
|
||||
|
||||
Program naj ustvari 5 novih procesov, otrok. Vsak otrok naj izpiše svoj PID in PID starša. Starš naj počaka, da se otroci zaključijo in nato izpiše svoj PID. Otroci naj se izvajajo vzporedno (kolikor bo sistem to dopuščal). Starš najprej ustvari vse otroke, šele nato jih prične čakati.
|
||||
|
||||
Primer zagona:
|
||||
|
||||
$ ./naloga_1
|
||||
otrok PID: 1324758, PPID: 1324757
|
||||
otrok PID: 1324759, PPID: 1324757
|
||||
otrok PID: 1324760, PPID: 1324757
|
||||
otrok PID: 1324761, PPID: 1324757
|
||||
otrok PID: 1324762, PPID: 1324757
|
||||
stars PID: 1324757
|
||||
|
||||
naloga_2 (naloga_2.c)
|
||||
|
||||
Program bo prejel dva argumenta. Prvi argument bo pot do vhodne zbirke, drugi argument bo pot do izhodne zbirke. Vhodna zbirka mora obstajati, izhodna ne sme. Program naj odpre zbirki in svoj standardni vhod zamenja z vhodno zbirko, svoj standardni izhod pa z izhodno zbirko. Nato naj požene program tr (klic fork ni potreben) s parametri "a-z" in "A-Z" kot:
|
||||
|
||||
$ tr a-z A-Z
|
||||
|
||||
to bo zamenjalo vse male črke vhodne zbirke z velikimi črkami in jih zapisalo v izhodno zbirko.
|
||||
|
||||
Primer zagona in izhoda:
|
||||
|
||||
$ echo hello world > vhod.txt
|
||||
$ ./naloga_2 vhod.txt izhod.txt
|
||||
$ cat izhod.txt
|
||||
HELLO WORLD
|
||||
$ ./naloga_2 vhod.txt izhod.txt
|
||||
napaka pri klicu open: file exists
|
||||
|
||||
naloga_3 (naloga_3.c)
|
||||
|
||||
Program bo preko argumentov prejel pot do programa in njegove parametre. Vaš program naj ustvari nov proces in v tem procesu požene podan program. Vaš program naj počaka da se podan program zaključi, nato pa naj prebere in izpiše njegovo izhodno vrednost. V primeru, da pri izvajanju podanega programa pride do napake, naj vaš program izpiše primerno opozorilo in izhodno vrednost -1.
|
||||
|
||||
Primer zagona:
|
||||
|
||||
$ ./naloga_3 /usr/bin/echo hello world
|
||||
hello world
|
||||
program je vrnil vrednost 0
|
||||
$ ./naloga_3 /usr/bin/ls ne_obstaja/
|
||||
/usr/bin/ls: cannot access 'ne_obstaja/': No such file or directory
|
||||
program je vrnil vrednost 2
|
26
semester_2/uvod_v_operacijske_sisteme/naloga_09/naloga_1.c
Normal file
26
semester_2/uvod_v_operacijske_sisteme/naloga_09/naloga_1.c
Normal file
@@ -0,0 +1,26 @@
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/wait.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char** argv){
|
||||
pid_t pid;
|
||||
|
||||
for (int i = 0; i < 5; i++){
|
||||
pid = fork();
|
||||
if(pid == 0){
|
||||
printf("PID: %d, PPID: %d\n", getpid(), getppid());
|
||||
exit(pid);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
wait(NULL);
|
||||
}
|
||||
|
||||
printf("PID: %d\n", getpid());
|
||||
|
||||
return 0;
|
||||
}
|
30
semester_2/uvod_v_operacijske_sisteme/naloga_09/naloga_2.c
Normal file
30
semester_2/uvod_v_operacijske_sisteme/naloga_09/naloga_2.c
Normal file
@@ -0,0 +1,30 @@
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
int main(int argc, char** argv){
|
||||
int in = open(argv[1], O_RDONLY);
|
||||
if(in == -1){
|
||||
perror("file doesn't exist\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(access(argv[2], F_OK) == 0)
|
||||
return -1;
|
||||
|
||||
int out = open(argv[2], O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
|
||||
|
||||
dup2(in, STDIN_FILENO);
|
||||
dup2(out, STDOUT_FILENO);
|
||||
|
||||
close(in);
|
||||
close(out);
|
||||
|
||||
char* arg[] = {"tr", "a-z", "A-Z", 0};
|
||||
execvp(arg[0], arg);
|
||||
|
||||
return 0;
|
||||
}
|
55
semester_2/uvod_v_operacijske_sisteme/naloga_09/naloga_3.c
Normal file
55
semester_2/uvod_v_operacijske_sisteme/naloga_09/naloga_3.c
Normal file
@@ -0,0 +1,55 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
int main(int argc, char** argv){
|
||||
|
||||
char* args[argc]; //argc == amount of arguments
|
||||
for(int i = 0; i < argc; i++){
|
||||
args[i] = argv[i+1];
|
||||
}
|
||||
args[argc-1] = 0;
|
||||
|
||||
int exit_status;
|
||||
|
||||
int new_pid = fork();
|
||||
|
||||
// po klicu fork imat stars in otrok oba oprimka do iste cevi,
|
||||
// in lahko v njo piseta ali iz nje bereta
|
||||
switch(new_pid){
|
||||
int ret_val;
|
||||
case -1:
|
||||
perror("napaka pri klicu fork");
|
||||
break;
|
||||
case 0:
|
||||
ret_val = execvp(args[0], args);
|
||||
if(ret_val == -1){
|
||||
perror("napaka pri klicu exec");
|
||||
}
|
||||
exit(ret_val); // proces se tukaj zakljuci
|
||||
break;
|
||||
default:
|
||||
// z dodatnim argumentom wait ali waitpid lahko
|
||||
// preberemo vrednost, ki jo proces vrne ob zakljucku
|
||||
waitpid(new_pid, &exit_status, 0);
|
||||
}
|
||||
|
||||
// preverimo, ali je proces vrnil vrednost
|
||||
if(WIFEXITED(exit_status)){
|
||||
int r = WEXITSTATUS(exit_status);
|
||||
if(r == 255) r = -1;
|
||||
printf("program je vrnil vrednost %d\n", r);
|
||||
}
|
||||
// preverimo, ali je proces bil prekinjen z signalom, na primer SegFault
|
||||
if(WIFSIGNALED(exit_status)){
|
||||
int sig_ind = WTERMSIG(exit_status);
|
||||
printf("program se je zakljucil s signalom %s\n", strsignal(sig_ind));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user