consolidate all repos to one for archive

This commit is contained in:
2025-01-28 13:46:42 +01:00
commit a6610fbc7a
5350 changed files with 2705721 additions and 0 deletions

View 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

View 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

View 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;
}

View 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;
}

View 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;
}