Forum » Programiranje » Programiranje v C v Linux oz. Unix
Programiranje v C v Linux oz. Unix
Terminator ::
Mi lahko kdo prosim prevede in požene ta dva programa v ukazni lupini Linx-a oz. Unix-a?Pa prosim,če mi točno Copy in Paste tisto kar oba programa izpišeta.
1.primer
1.primer
#include stdio.h #include stdlib.h #include unistd.h void main(argc,argv) int argc; char *argv[]; { int pid_sina; int a; int *b; FILE *fd; char znak; a=5; b = (int *) malloc(sizeof(int)); *b = 8; fd = fopen("prvi.c","r"); fscanf(fd,"%c ",&znak); printf("Znak = %c \n",znak); printf("Moj pid = %i \n", getpid()); if ((pid_sina=fork())==0){ /* sin */ *b = 30; fscanf(fd,"%c ",&znak); printf("Moj PID = %i. A = %i B = %i Znak = %c \n", getpid(),a, *b, znak); } else { /* oce */ /* sleep(5); */ a=9; fscanf(fd,"%c ",&znak); printf("Moj PID = %i. A = %i B = %i Znak = %c \n", getpid(),a, *b, znak); } } 2.primer #include stdio.h #include stdlib.h #include unistd.h #include time.h #include sys/types.h #include sys/ipc.h #include sys/shm.h #include sys/sem.h void W(id) int id; { struct sembuf sops; sops.sem_num=0; sops.sem_op=-1; sops.sem_flg=0; if (semop (id,&sops,1)==-1) printf("Napaka v WAIT!\n"); } void S(id) int id; { struct sembuf sops; sops.sem_num=0; sops.sem_op=1; sops.sem_flg=0; if(semop (id,&sops,1)==-1) printf("Napaka v SIGNAL!\n"); } void SetVal(id, value) int id; int value; { union semun arg; arg.val=value; semctl(id,0,SETVAL,arg); } void main(argc,argv) int argc; char *argv[]; { int pid_sina; int shmid; struct shmid_ds buf; int *a; int semid; time_t t; /* Skupen pomnilnik */ shmid = shmget (IPC_PRIVATE, 10*sizeof(int), 0600); a = (int *) shmat (shmid, (char *) 0, 0600); /* Semafor */ semid = semget (IPC_PRIVATE, 1, 0600); /* Nastavi semafor */ SetVal(semid,1); time(&t); srand((unsigned int) t); a[0]=1; a[1]=4; a[5]=23; if ((pid_sina=fork())==0) { /* sinov del -- consumer */ int k; printf("Sinov del. PID = %i \n",getpid()); while (a[0]) { W(semid); for (k=0; k < 10; k++) printf(" %i",a[k]); //sleep(0.01); S(semid); printf("\n"); } exit(1); } /* oce producer */ printf("Ocetov del. PID = %i \n", getpid()); while (a[0]) { float rnd; int nst; rnd = (float) rand()/((float) RAND_MAX); nst=(int) (rnd*10.0); W(semid); printf("Nov num = %i \n", nst); a[0]=nst; S(semid); sleep(0.2); } wait(0); /* pocisti */ shmctl (shmid, IPC_RMID, &buf); semctl (semid, 0, IPC_RMID,0); }
- spremenil: Mavrik ()
Hardstyle ::
Jaz pa rabim pomoč pri C in sicer je situacija taka, da C kar razumem ampak moje znanje je za kaj takega res preslabo, da bi kaj skup spravil, sploh pa ne zgooglam nič kar bi mi pomagalo.
Tukaj je besedilo naloge(to kar je podčrtano dela kodaj spodaj):
Restavracija Desetka ima solatni bar, v katerem se nahaja 8 različnih vrst solat. Vsake vrste solate je za 20 študentov. Ob solatnem baru si lahko istočasno postrežeta 2 študenta, vendar ne solate iste vrste. Če solate ene vrste zmanjka, si študent izbere drugo vrsto. Če pa ni več nobene solate, pa študent zapusti bar. Napišite program desetka.c, kjer boste simulirali solatni bar za n študentov.
Dodatna razlaga: Oče ustvari n procesov (študentov), ki se izvajajo vzporedno! Solatni bar predstavite s skupnim pomnilnikom, kjer pa potrebujete en števni semafor za pristop "študenta" (procesa) do solatnega bara in eno polje binarnih semaforjev za dostop do posamezne "solate" (skupni pomnilnik). Vsak študent naj izpiše katero solato si je vzel. Izbiro solate naj naključno (rand) izračuna oče (v nasprotnem primeru bo vedno enaka vrednost).
In tukaj kar sem ustvaril do sedaj:
Tukaj je besedilo naloge(to kar je podčrtano dela kodaj spodaj):
Restavracija Desetka ima solatni bar, v katerem se nahaja 8 različnih vrst solat. Vsake vrste solate je za 20 študentov. Ob solatnem baru si lahko istočasno postrežeta 2 študenta, vendar ne solate iste vrste. Če solate ene vrste zmanjka, si študent izbere drugo vrsto. Če pa ni več nobene solate, pa študent zapusti bar. Napišite program desetka.c, kjer boste simulirali solatni bar za n študentov.
Dodatna razlaga: Oče ustvari n procesov (študentov), ki se izvajajo vzporedno! Solatni bar predstavite s skupnim pomnilnikom, kjer pa potrebujete en števni semafor za pristop "študenta" (procesa) do solatnega bara in eno polje binarnih semaforjev za dostop do posamezne "solate" (skupni pomnilnik). Vsak študent naj izpiše katero solato si je vzel. Izbiro solate naj naključno (rand) izračuna oče (v nasprotnem primeru bo vedno enaka vrednost).
In tukaj kar sem ustvaril do sedaj:
#define _SVID_SOURCE #define _XOPEN_SOURCE 600 #include <stdio.h> #include <stdlib.h> #include <sys/sem.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <time.h> #include <sys/shm.h> int main(int argc, char*argv[]) { struct sembuf sobs; int i,ret,j,shmid,nakljucna_solata,semid,a,semid2,b,k; srand(time(NULL)); /*preverimo če je uporabnik vnesel natanko en argument v ukazni vrstici*/ if(argc<2 || argc>2) { printf("Vnesel si premalo argumentov. Vnesti moraš natanko en argument.\n"); } else { /*kreiramo skupni pomnilnik, ki predstavlja solatni bar*/ shmid=shmget(111111,8*sizeof(int),IPC_CREAT | 0600); /*ustvarimo 1. semafor in mu nastavimo vrednost*/ semid=semget(3333337,1,IPC_EXCL|IPC_CREAT|0600); semctl(semid,0,SETVAL,2); /*ustvarimo 2. semafor semid2=semget(6666668,8,IPC_EXCL|IPC_CREAT|0600);*/ /*kreiramo toliko vzporednih procesov, kot je argument v ukazni vrstici*/ for(i=0; i<atoi(argv[1]);i++) { ret=fork();/*ustvarimo proces*/ nakljucna_solata=rand()%8;/*oče izbere naključno solato*/ /*preverimo če je trenutni proces sin*/ if(ret==0) { sobs.sem_num=0; sobs.sem_op=-1; sobs.sem_flg=0; /*vstopimo v kritični odsek*/ a=semop(semid,&sobs,1); /*ni potrebno preverjati*/ if(a<0) { printf("sta že dva študenta\n"); } else { sleep(1); /*študent je v solatnem baru 1 sekundo*/ sobs.sem_op=1; /*izstopimo iz kritičnega odseka*/ semop(semid,&sobs,1); } exit(0); } } for(j=0; j<atoi(argv[1]);j++) { wait(0); } } /*izbris semaforja*/ semctl(semid,0,IPC_RMID); return 0; }
Zgodovina sprememb…
- spremenil: Hardstyle ()
DubleG ::
Da ne bom ustvarjal nove teme...
Imam N semaforčkov. Vsak proces ima svoj semaforček. Ko proces konča z delom ga postavi na zeleno.
Oče sme nadaljevat šele ko so VSI semaforčki odprti. Kako se preverja stanje gruče semaforčkov?
Imam N semaforčkov. Vsak proces ima svoj semaforček. Ko proces konča z delom ga postavi na zeleno.
Oče sme nadaljevat šele ko so VSI semaforčki odprti. Kako se preverja stanje gruče semaforčkov?
GA-P55M-UD2,i5,12GB RAM,Radeon HD 4850,Crucial SSD 64GB,
WD 320GB,WD 5000GB,RevoDrive X2 100GB
WD 320GB,WD 5000GB,RevoDrive X2 100GB
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Niti - segmentation faultOddelek: Programiranje | 1970 (817) | galu |
» | [C] Sinhronizacija procesovOddelek: Programiranje | 1131 (1004) | Cvenemir |
» | [C] ProcesiOddelek: Programiranje | 967 (876) | Cvenemir |
» | skupni pomnilnik © linuxOddelek: Programiranje | 2475 (2321) | Keki |
» | Časovna zahtevnost programaOddelek: Programiranje | 1592 (1471) | CaqKa |