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,9 @@
all: naloga_1 naloga_2
naloga_1: naloga_1.c
gcc naloga_1.c -pthread -o naloga_1
rm naloga_1.c
naloga_2: naloga_2.c
gcc naloga_2.c -pthread -o naloga_2
rm naloga_2.c
clean:
rm -f naloga_1 naloga_2

View File

@@ -0,0 +1,67 @@
Niti (sprotna naloga)
V sklopu te naloge demonstrirajte uporabo knjižnice pthread za niti. Pripravite 3 programe, ki izvedejo v nadaljevanju opisane naloge. Pripravite tudi Makefile, ki bo vašo kodo prevedel v izvedljive programe.
Posamezni naslov podnaloge 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)
Vaš program bo prejel parametre preko ukazne vrstice v obliki:
$ ./naloga_1 <milisekunde> <sporocilo> <milisekunde> <sporocilo> ...
Milisekunde so vedno cela števila.
Za vsak par argumentov milisekunde in sporočilo naj program ustvari novo nit. Nit naj najprej počaka podano število milisekund nato pa izpiše svojo zaporedno število in sporočilo. Glavna nit mora seveda počakati vse ustvarjene niti. Niti bo največ 10.
Primer zagona in izpisa:
$ ./naloga_1 300 konec 100 zacetek 200 jedro
nit 2: zacetek
nit 3: jedro
nit 1: konec
naloga_2 (naloga_2.c)
Vaš program bo prejel poti do 3 zbirk (pravzaprav bodo to imenovane cevi). Te zbirke odprite samo za branje. Za vsako pot ustvarite svojo nit, ki bo iz podanega vira prebrala 10 znakov dolgo sporočilo. Vsaka nit naj izpiše prebrano sporočilo skupaj s svojim zaporednim številom. Sporočilo naj vrne glavni niti.
Glavna nit naj po zaključku vseh ustvarjenih niti izpiše vsa tri sporočila kot eno sporočilo.
Primer zagona in izpisa:
$ ./naloga_2 ./zbirka_1 ./zbira_2 ./zbirka_3
nit 3: ih_______
nit 1: sporocilo_
nit 2: v_treh_kos
glavna nit: sporocilo_v_treh_kosih_______
naloga_3 (naloga_3.c)
Implementiranje program, ki pospeši seštevanje vrednosti s pomočjo niti. Kot parametri ukazne vrstice bo programu podano število vrednosti, pot do zbirke s podatki in število niti, ki jih želimo uporabiti za seštevanje.
Za odpiranje uporabite funkcijo fopen, ali pa kombinacijo open in fdopen. Nato lahko podatke preberete s funkcijo fscanf, po vzoru:
int val;
fscanf(in_file_obj, "%d", &val);
ki prebere eno vrednost in jo hrani v spremenljivko val. V zbirki bo vsaj toliko vrednosti, kot jih potrebujete, morda več. Vrednosti preberete v dovolj veliko tabelo.
Nato naj glavna nit ustvari podano število niti, vsaka nit pa naj sešteje svoj del tabele. Glavna nit mora ustvariti vse niti preden začne čakati na njihove rezultate.
Problem seštevanja rešite s prepletanjem. Za N niti, prva nit sešteva vrednost 0, N, 2*N, ... druga nit 1, N+1, 2*N+1, ... in tako dalje (vsaka nit začne na svojem mestu tabele, nato pa skačejo po N mest).
Vsaka nit naj izpiše svoj delni seštevek, glavna nit pa naj nato rezultate posameznih niti sešteje in izpiše celotno vsoto.
Primer zagona in izpisa (prebere 11 števil iz zbirke podatki.txt in jih sešteje s 3-mi nitmi):
$ ./naloga_3 11 ./podatki.txt 3
nit 1: 7
nit 3: 5
nit 2: 0
vsota: 12
Vsebina testne zbirke podatki.txt:
1 -3 7 0 2 -1 4 5 -1 2 -4 1 -3 5 12 8

View File

@@ -0,0 +1,47 @@
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>
#include <sys/types.h>
#include <string.h>
#include <pthread.h>
struct thread_args{
int post, num;
char* mesg;
};
typedef struct thread_args thread_args;
void* thread_main(void* args)
{
thread_args *object_argument = (thread_args*)args;
usleep(object_argument[0].num*1000);
printf("nit %d: %s\n", object_argument[0].post, object_argument[0].mesg);
return args;
}
int main(int argc, char** argv)
{
int post = 0, value;
thread_args args[(argc-1)/2];
pthread_t tid[(argc-1)/2];
for(int i = 1; i < argc; i++)
if(i%2 == 1)
{
args[post].post = post + 1;
args[post].num = atoi (argv[i]);
args[post].mesg = argv[i+1];
value = pthread_create(&tid[post], NULL, thread_main, &args[post]);
post++;
}
for(int i = 0; i < post; i++)
pthread_join(tid[i], NULL);
return 0;
}

View File

@@ -0,0 +1,54 @@
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>
#include <sys/types.h>
#include <string.h>
#include <pthread.h>
struct thread_args{
char *sporocilo;
char mes[5];
int pozicija;
};
typedef struct thread_args thread_args;
void *thread_main(void *argument){
char buffer[10];
thread_args *object_argument = (thread_args*) argument;
int file = open(object_argument[0].sporocilo, O_RDONLY, 0);
read(file, buffer, sizeof(buffer));
printf("nit %d: %s\n", object_argument[0].pozicija, buffer);
for(int i = 0; i<10; i++){
object_argument[0].mes[i] = buffer[i];
}
return argument;
}
int main(int argc, char **argv){
int pozicija = 0;
thread_args arg[3];
pthread_t tid[3];
for(int i = 0; i<3; i++){
arg[i].pozicija = pozicija +1;
arg[i].sporocilo = argv[i+1];
pthread_create(&tid[i], NULL, thread_main, &arg[i]);
pozicija += 1;
}
for(int i = 0; i<3; i++){
pthread_join(tid[i], NULL);
}
printf("\nglavna nit: ");
for(int i = 0; i<3; i++){
printf("%s", arg[i].mes);
}
printf("\n");
return 0;
}