» »

Procesi v Linux-u

Procesi v Linux-u

hurlimannxt ::

Pozdravljeni!

Prosil bi, če je kdo pri volji, da bi rešil to nalogo, nalogo je treba reševat v Linuxu. Imam več nalog, ki imajo opravka s procesi v linux-u, ampak žal nimam niti malo pojma o načinu reševanja zato bi rabil en rešen primer. Po tem primeru bi še ostale naloge reševal, ki jih imam.
Upam, da se me kdo usmili.

Pa še eno vprašanje imam, če ve kdo za koga v Mariboru ali Celju, da inštruira programiranje v C++. Ker imam velik težav, bi se raj na koga takega obrnu, pa bi zadeve hitrej rešu.

Napišite program, ki bo preko vhodnih argumentov prebral dve števili (uporabite atoi funkcijo nad vhodnimi argumenti za pretvorbo vhodnih nizov v integer). Nadalje naj program ustvari n sinov (prvi vhodni argument), kjer vsak i-ti ustvarjeni sin izračuna in izpiše i-to potenco števila podanega kot drugi vhodni argument(primer za potenco: prvi ustvarjeni sin: osnova¹, drugi sin: osnova², tretji sin: osnova³,...).

Pazite, da se oče ne konča pred sinovi (zombiji so nesprejemljivi) in poskušajte program napisati čimbolj robustno. Prav tako pazite, da ne boste ustvarili neskončne zanke, ki bi generirala procese (fork bombo)!

Oddati moram arhiv s sledečimi zbirkami;

* zbirko in
* Makefile, ki zgradi izvedljiv program procesi in pobriše vse generirane zbirke in direktorije.

metalc ::

Samo namig. V Unixih (in tudi v Linuxu) se procesi "razmnožujejo" s sistemskim klicem (oz. če hočeš, funkcijo) fork() in po vrnjeni vrednosti ugotoviš, ali si v "staršu" ali "potomcu". Ko boš prebral man, bi ti moralo biti jasno dovolj, da boš znal nadaljevati.

bigbada ::

Evo ti rešeno.

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main(int argc, char** argv) {
	
	if(argc!=3) //ce argument count(argc) ni 3 izpisi navodila
	 {
	   printf("Napacen vnos! Podaj argumente!\n");
	 }

	 else
  	 {
	   //z funkcijo atoi pretvorimo vhodne argumente, do katerih dostopamo preko argument vectorja(argv) v integerje
	   int n=atoi(argv[1]);
	   int osnova=atoi(argv[2]);

	   int sin=0;
	   int total=1;
	   int i=1;

	for(i; i<=n; i++) 
	 {
		total=total*osnova;
		sin=fork(); 
		  if(sin==0) 
		   {
		     printf("%d ustvarjeni sin: osnova(%d) na %d = %d\n", i, osnova, i, total);
	 	     exit(0);
	           }

 		  else //cakanje na sina
		   {
		     wait(&sin); 
		   }
	}

    }
        return 0;	 
}


Pa še Makefile:
GCC=gcc
CFLAGS=-c -g
LFLAGS=
EXE=potence

all: ${EXE}.o
	${GCC} ${LFLAGS} ${EXE}.o -o ${EXE}

${EXE}.o: ${EXE}.c
	${GCC} ${CFLAGS} ${EXE}.c

clean:
	rm -rf *.o
	rm -rf ${EXE}

hurlimannxt ::

Hvala za odgovor in rešitev. Imam še nekaj nalog iz procesov v linux-u.
Sam sem že reševal zdaj novo nalogo iz procesov in še imam nekaj težav.

Najprej pa točna navodila

Napišite programa, kjer oče ustvari n procesov (sinov). Vsak proces (sin) naj v zanki m-krat izpiše svoj pid in izračuna povprečje prvih "k-zaporedna_številka_sina" števil. Razlika med programoma naj bo le ta, da se pri prvem programu procesi izvajajo striktno zaporedno, medtem ko se pri drugem programu procesi izvajajo striktno vzporedno (razlika v delovanju je vidna v izpisu).

Namigi:

* Razlika je v postavljanju funkcije wait (mesto kje v programski kodi se nahaja).
* Če je zaporedno število sina večje od k, program za povprečje vrne 0.
* Ko boste prepričani, da programa vredu delujeta (da ni forkbombe) poiskusite uporabiti za m večje število, da vidite razliko med vzporednem in zaporednem delovanju.
* Vrednosti n,m in k se podajo kot vhodni argumenti programa.
* Ne pozabite na zombije (oče počaka sine).

# vzporedno.c,
# zaporedno.c in
# Makefile (ki poskrbi za prevajanje obeh datotek).

Težave je da nevem kako se naredi makefile, da bom lahko preverjal dve datoteki in, če bi mi lahko še namignil kaj še moram v kodi spremenit, da bom prišel do končne rešitve, ker trenutno še zagnat ne morem.

Tole je pa koda za vzporedno in zaporedno delovanje, ki sem jo napisal.

Zaporedno delovanje
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
 
//zaporedno delovanje

int main() {

int i;

for (i=0; i<5; i++){
	//fork naredi nov proces
	if(vfork()) == 0) {
	//sin
	print("Sin Zacetek!\n");
	//delo
	sleep(5); //si spi 5 sekund
	print("Sin Konec!\n");
	exit(0);
}

	else {
	//oče caka 0 sekund
	wait(0);

}

}

return 0;
}





Vzporedno delovanje

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

//vzporedno delovanje
 
int main() {

int i;

for (i=0; i<5; i++){
	if (vfork()) == 0) {
	//sin
	print("Sin Zacetek!\n");
	//delo
	sleep(5);
	print("Sin Konec!\n");
	exit(0);
}

	else {
	//oče
	
}
for (i=1; i<5; i++){
	wait (0);

}


}

wait (0);
return 0;
}




Vredno ogleda ...

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

[C] Procesi

Oddelek: Programiranje
6970 (879) Cvenemir
»

[C] Vsota števil v polju

Oddelek: Programiranje
51273 (1211) Cvenemir
»

C (Izračun povprečja)

Oddelek: Programiranje
141620 (1254) joze67
»

[C] najmanjse stevilo

Oddelek: Programiranje
101083 (944) BigWhale
»

C - pomoč

Oddelek: Programiranje
111451 (1191) Thagirion

Več podobnih tem