» »

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

#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:
#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…

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?
GA-P55M-UD2,i5,12GB RAM,Radeon HD 4850,Crucial SSD 64GB,
WD 320GB,WD 5000GB,RevoDrive X2 100GB


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Niti - segmentation fault

Oddelek: Programiranje
211970 (817) galu
»

[C] Sinhronizacija procesov

Oddelek: Programiranje
71131 (1004) Cvenemir
»

[C] Procesi

Oddelek: Programiranje
6967 (876) Cvenemir
»

skupni pomnilnik &#169; linux

Oddelek: Programiranje
62475 (2321) Keki
»

Časovna zahtevnost programa

Oddelek: Programiranje
61592 (1471) CaqKa

Več podobnih tem