consolidate all repos to one for archive
This commit is contained in:
6
semester_2/uvod_v_operacijske_sisteme/naloga_08/Makefile
Normal file
6
semester_2/uvod_v_operacijske_sisteme/naloga_08/Makefile
Normal file
@@ -0,0 +1,6 @@
|
||||
all: naloga_1 naloga_2 naloga_3
|
||||
naloga_1: naloga_1.c
|
||||
gcc naloga_1.c -pthread -lrt -o naloga_1
|
||||
rm naloga_1.c
|
||||
clean:
|
||||
rm -f naloga_1
|
@@ -0,0 +1,31 @@
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char** argv){
|
||||
char *ime_cevi = "./cev_1";
|
||||
|
||||
// cev odpremo in uporabimo enako kot zbirko,
|
||||
// vendar jo moramo odpreti samo za pisanje ali samo za branje!!!
|
||||
int fd = open(ime_cevi, O_WRONLY);
|
||||
if(fd==-1){
|
||||
perror("napaka pri klicu open");
|
||||
return -1;
|
||||
}
|
||||
printf("cev uspesno odprta za pisanje \n");
|
||||
char *sporocilo = "to je malce daljse sporocilo, ki ga bomo zapisali v cev\n";
|
||||
// v cev nismo zapisali vrednosti 0 na koncu niza, na drugi strani jo moramo
|
||||
// ponovno dodati
|
||||
if(write(fd, sporocilo, strlen(sporocilo))==-1){
|
||||
perror("napaka pri klicu write");
|
||||
return -1;
|
||||
}else{
|
||||
printf("sporocilo zapisano\n");
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
@@ -0,0 +1,39 @@
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <errno.h>
|
||||
|
||||
int main(int argc, char** argv){
|
||||
char *ime_cevi = argv[1];
|
||||
|
||||
if(mkfifo(ime_cevi, S_IRUSR|S_IWUSR) == -1){
|
||||
perror("napaka pri klicu mkfifo");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int fd = open(ime_cevi, O_RDONLY);
|
||||
|
||||
char sporocilo[1];
|
||||
int count = 0;
|
||||
|
||||
while(true){
|
||||
|
||||
int r = read(fd, sporocilo, 1);
|
||||
if(r==0){
|
||||
break;
|
||||
}
|
||||
if(r<0){
|
||||
perror("napaka pri klicu read");
|
||||
return -1;
|
||||
}
|
||||
printf("%s", sporocilo);
|
||||
count = count + 1;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
printf("\nstevilo znakov: %d",count);
|
||||
return 0;
|
||||
}
|
@@ -0,0 +1,30 @@
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <mqueue.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char** argv){
|
||||
char *ime_vrste = argv[1];
|
||||
|
||||
|
||||
|
||||
mqd_t mq_fd = mq_open(ime_vrste, O_WRONLY);
|
||||
if(mq_fd == -1){
|
||||
perror("napaka pri klicu mq_open");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char *sporocilo = argv[3];
|
||||
int prioriteta = atoi(argv[2]);
|
||||
if(mq_send(mq_fd, sporocilo, strlen(sporocilo), prioriteta) == -1){
|
||||
perror("napaka pri klicu mq_send, prvic");
|
||||
}else{
|
||||
printf("sporocilo: %s, s prioriteto %d poslano\n", sporocilo, prioriteta);
|
||||
}
|
||||
|
||||
mq_close(mq_fd);
|
||||
return 0;
|
||||
}
|
@@ -0,0 +1,30 @@
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <mqueue.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char** argv){
|
||||
char *ime_vrste = "/moja_vrsta";
|
||||
|
||||
// odpremo obstojeco vrsto za prejemanje sporocil
|
||||
mqd_t mq_fd = mq_open(ime_vrste, O_RDONLY);
|
||||
if(mq_fd == -1){
|
||||
perror("napaka pri klicu mq_open");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// prejmemo eno sporocilo
|
||||
char sporocilo[101]="";
|
||||
int prioriteta;
|
||||
int len = mq_receive(mq_fd, sporocilo, 100, &prioriteta);
|
||||
if(len == -1){
|
||||
perror("napaka pri klicu mq_receive");
|
||||
}else{
|
||||
sporocilo[len] = 0;
|
||||
printf("prejeto sporocilo: %s, s prioriteto %d\n", sporocilo, prioriteta);
|
||||
}
|
||||
|
||||
mq_close(mq_fd);
|
||||
return 0;
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <mqueue.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, char** argv){
|
||||
char *ime_vrste = "/moja_vrsta";
|
||||
|
||||
if(mq_unlink(ime_vrste)==-1){
|
||||
perror("napaka pri klicu mq_unlink");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
@@ -0,0 +1,63 @@
|
||||
|
||||
|
||||
void thread1(){
|
||||
|
||||
ce nisi dobil error{
|
||||
cv = odpri cev2 WRONLY
|
||||
}ce si dobil error{
|
||||
cv = odpri cev1 WRONLY
|
||||
}
|
||||
|
||||
while(running){
|
||||
preberi sporocilo iz terminala;
|
||||
ce je sporocilo enako ""{
|
||||
poslji v cv ("n");
|
||||
zaustavi thread1(brak)
|
||||
!!!uporabi pthread_cancel() da ustavis thread2!!!
|
||||
}ce ne{
|
||||
poslji v cv (sporocilo);
|
||||
}
|
||||
}
|
||||
zapri cv;
|
||||
}
|
||||
|
||||
void thread2(){
|
||||
|
||||
ce nisi dobil error{
|
||||
cv = odpri cev1 RDONLY
|
||||
}ce si dobil error{
|
||||
cv = odpri cev2 RDONLY
|
||||
}
|
||||
|
||||
while(running){
|
||||
preberi iz cevi (cv) sporocilo;
|
||||
|
||||
izpisi na terminal sporocilo;
|
||||
|
||||
ce je sporocilo enako "n"{
|
||||
zaustavi thread2(brak)
|
||||
!!!uporabi pthread_cancel() da ustavis thread1!!!
|
||||
}
|
||||
}
|
||||
|
||||
zapri cv;
|
||||
}
|
||||
|
||||
|
||||
main(){
|
||||
char cev1 = "./" + argv[1] + "1";
|
||||
char cev2 = "./" + argv[1] + "2";
|
||||
|
||||
ustvari cev1;
|
||||
ustvari cev2;
|
||||
ce dobis error da cev obstaja si zapomni;
|
||||
|
||||
ustvari thread 1 in 2;
|
||||
|
||||
pocakaj da se thred 1 in 2 zakljuci;
|
||||
|
||||
unlink cev 1 in 2;
|
||||
}
|
||||
|
||||
|
||||
za prenos podatkov med cevmi in thredi je meni bilo najlazje uporabljati globalne premenljivke
|
40
semester_2/uvod_v_operacijske_sisteme/naloga_08/README.md
Normal file
40
semester_2/uvod_v_operacijske_sisteme/naloga_08/README.md
Normal file
@@ -0,0 +1,40 @@
|
||||
Medprocesna komunikacija (sprotna naloga)
|
||||
|
||||
V sklopu te naloge demonstrirajte uporabo metod za medprocesno komunikacijo. 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 cev, pot z imenom bo podana v prvem argumentu. Če podana pot kaže na že obstoječo zbirko, kazalo ali cev naj izpiše sporočilo. Nato naj program prebere vsebino in prešteje število vseh poslanih znakov. Po zaključku branja naj izpiše prešteto število poslanih znakov.
|
||||
|
||||
Primer zagona:
|
||||
|
||||
$ ./naloga_1 ./nova_cev &
|
||||
$ ( echo -n "pozdravljen "; sleep 1; echo svet ) > ./nova_cev # to lahko pozenete tudi v drugem terminalu v isti poti, spodnji izpis je od programa ./naloga_1
|
||||
stevilo znakov: 17
|
||||
|
||||
naloga_2 (naloga_2.c)
|
||||
|
||||
Program prejme tri argumente. Prvi argument je ime vrste za sporočila, drugi argument je prioriteta sporočila, tretji argument pa sporočilo. Program naj odpre vrsto za sporočila in pošlje podano sporočilo s podano prioriteto. V kolikor pride to težav, naj izpiše primerno opozorilo.
|
||||
|
||||
Primer zagona:
|
||||
|
||||
$ ./naloga_2 /nova_vrsta 1 hello
|
||||
$ ./naloga_2 /nova_vrsta 1 world
|
||||
$ ./naloga_2 /nova_vrsta 1 ""
|
||||
$ ./naloga_2 /nova_vrsta 1 "hello world"
|
||||
napaka pri odpiranju vrste, vrsta ne obstaja
|
||||
|
||||
naloga_3 (naloga_3.c)
|
||||
|
||||
Napišite program, ki bo omogočal dvosmerno komunikacijo. Kot prvi argument naj program prejme ključ (ključ bo veljavno ime zbirke ali vrste za sporočila brez začetnega '/'). V kolikor program poženete dvakrat iz različnih terminalov z istim ključem, si oba pognana programa pošiljata sporočila med sabo. Programa pognana z različnima ključema ne omogočata komunikacije.
|
||||
|
||||
Za komunikacijo lahko uporabite cevi ali vrste za sporočila. V obeh primerih boste potrebovali dva primerka. Prva cev ali vrsta pošilja sporočila od prvega programa drugemu, druga cev ali vrsta pošilja sporočila od drugega programa prvemu. Dobro premislite o vaši izbiri, ena je morda primernejša in enostavnejša za uporabo.
|
||||
|
||||
Iz podanega ključa naj program ustvari dva različna imena in z njima poskusi ustvariti dve cevi ali vrsti za sporočila. V kolikor jih uspešno ustvari, je to prva pognana instanca. V kolikor cevi ali vrsti že obstajajo, je to druga pognana instanca.
|
||||
|
||||
Program naj bere sporočila z standardnega vhoda dolga vsaj 10 znakov. Vsako prebrano sporočilo naj pošlje drugemu programu. Vsako prejeto sporočilo naj izpiše na standardni izhod. Komunikacija ni nujno izmenična. Program se zaključi kadar prejme prazno sporočilo (samo "n"). Ob zaključku enega programa se zaključi tudi drugi. Cevi ali vrsti uporabljeni za komunikacijo je potrebno pred zaključkom programov pobrisati, da lahko ponovno poženemo dve istanci z istim ključem.
|
||||
|
||||
Primer zagona (samo za podan argument, dejanska uporaba in pošiljanje nista prikazana):
|
||||
|
||||
$ ./naloga_3 kljuc_1234
|
121
semester_2/uvod_v_operacijske_sisteme/naloga_08/naloga_3.c
Normal file
121
semester_2/uvod_v_operacijske_sisteme/naloga_08/naloga_3.c
Normal file
@@ -0,0 +1,121 @@
|
||||
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
|
||||
char cev1[100] = "./";
|
||||
char cev2[100] = "./";
|
||||
int running = 1;
|
||||
int icev1, icev2;
|
||||
pthread_t tid[2];
|
||||
|
||||
void* thrpisi(){
|
||||
char sporocilo[10];
|
||||
int closep = 0;
|
||||
while(running == 1){
|
||||
//if (scanf( "%10s", sporocilo ) == 0) break;
|
||||
|
||||
int c;
|
||||
size_t i = 0;
|
||||
while (i < 9 && (c=getchar()) != EOF) {
|
||||
sporocilo[i] = c;
|
||||
if (sporocilo[i] == '\n') {
|
||||
break;
|
||||
}
|
||||
++i;
|
||||
}
|
||||
sporocilo[i] = '\0';
|
||||
|
||||
printf("poslali smo: %s\n", sporocilo);
|
||||
if(strcmp(sporocilo, "") == 0){
|
||||
write(icev1, "n", strlen("n"));
|
||||
printf("se ujema\n");
|
||||
running = 0;
|
||||
pthread_cancel(tid[1]);
|
||||
break;
|
||||
}
|
||||
write(icev1, sporocilo, strlen(sporocilo));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void* thrberi(){
|
||||
char sporocilo[10];
|
||||
int l;
|
||||
int closep = 0;
|
||||
while(running == 1){
|
||||
l = read(icev2, sporocilo, sizeof(sporocilo));
|
||||
if(l<=0)break;
|
||||
sporocilo[l] = 0;
|
||||
printf("prejeli smo odgovor: %s\n",sporocilo);
|
||||
if(strcmp(sporocilo, "n") == 0){
|
||||
printf("se ujema\n");
|
||||
running = 0;
|
||||
pthread_cancel(tid[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv){
|
||||
|
||||
char* src = argv[1];
|
||||
|
||||
|
||||
strcat(cev1, src);
|
||||
strcat(cev1, "vhod");
|
||||
printf("%s\n", cev1);
|
||||
|
||||
strcat(cev2,src);
|
||||
strcat(cev2,"izhod");
|
||||
printf("%s\n", cev2);
|
||||
|
||||
int created = 0;
|
||||
if(mkfifo(cev1, S_IRUSR|S_IWUSR)==-1){
|
||||
perror("napaka pri klicu mkfifo");
|
||||
}
|
||||
|
||||
if(mkfifo(cev2, S_IRUSR|S_IWUSR)==-1){
|
||||
perror("napaka pri klicu mkfifo");
|
||||
}
|
||||
|
||||
if(mkfifo("test", S_IRUSR|S_IWUSR)==-1){
|
||||
created = 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(created){
|
||||
icev1 = open(cev1, O_WRONLY);
|
||||
icev2 = open(cev2, O_RDONLY);
|
||||
|
||||
}else{
|
||||
icev2 = open(cev1, O_RDONLY);
|
||||
icev1 = open(cev2, O_WRONLY);
|
||||
}
|
||||
|
||||
pthread_create(&tid[0], NULL, thrpisi, NULL);
|
||||
pthread_create(&tid[1], NULL, thrberi, NULL);
|
||||
|
||||
pthread_join(tid[0], NULL);
|
||||
pthread_join(tid[1], NULL);
|
||||
|
||||
close(icev1);
|
||||
close(icev2);
|
||||
|
||||
printf("closing\n");
|
||||
unlink(cev1);
|
||||
unlink(cev2);
|
||||
unlink("test");
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user