Gå til innhold

Hjelp til enkel kode: foreldre og barneprosess


Anbefalte innlegg

Hei.

 

Har en oppgave i Operativsystemer i Linux der vi skal skrive litt C. Men jeg har ikke peiling på C i det heletatt, og det er heller ikke meningen at vi skal lære C i dette kurset. Har forsøkt og vet ikke om det jeg har gjort er rett. Uansett. Her er oppgaven

 

Oppgave 4

Merk at de to prosessene ovenfor har identiske programkode-segmenter. Prosessene kjører

instruksjoner på forskjellig sted i det samme programmet. En enkel if-setning tester om det er

foreldre eller barn, og dermed hvilken del av programkoden som skal kjøres.

Vi skal nå utvide koden ovenfor til følgende:

1. Foreldre-prosess skal aller først opprette en barneprosess (som ovenfor), deretter

skal den gå i ei løkke et gitt antall ganger og skrive ut en tekststreng, f.eks. “Hu og hei

hvor det går!”.

2. Barneprosessen skal gå i ei løkke samme antall ganger som ovenfor, og for hver

gjennomgang i løkka skal følgende strek skrives ut: ”--------------------”

Lag programkoden som utfører ovenstående. Prøv med hundre tusen gjennomganger

(eventuelt flere dersom du ikke ser noe spesielt). Hva observerer du? Hvordan kan du

forklare det du ser på skjermen?

 

Dette er det jeg har skrevet

 

#include <unistd.h>

#includ <stdio.h>

int main() {

int nr;

nr = fork();

if(nr==0){ // Betyr at det er barneprosess

int teller;

int max;

 

max = 100000;

for(teller=0; teller<max; teller++)

printf("Barneprosess nr = %d og pid = %d, nr, getpid());

sleep (20);

exit(0);

}

else{ // Da må det være en foreldreprosess

int teller2;

int max2;

 

max2= 100000;

for(teller2=0; teller2<max2; teller2++)

printf(Foreldreprosess nr = %d og pid = %d, nr, getpid());

sleep(20);

exit(0);

}

}

 

Men utifra hva programmet skriver ut så tviler jeg sterkt på at det er rett...

Lenke til kommentar
Videoannonse
Annonse
Noen som kunne gitt meg et pek i riktig retning i det minste?

 

Du kan begynne med å få programmene til å skrive ut det de skal skrive ut ihht. oppgaveteskten. Alltid en god start å få samme output som oppgaven krever.

 

Deretter kan du titte i "Advanced programming in the UNIX environment". HiST har dessverre ikke den på biblioteket, men amazon burde kunne levere ting ganske greit.

Lenke til kommentar
Noen som kunne gitt meg et pek i riktig retning i det minste?

 

Du kan begynne med å få programmene til å skrive ut det de skal skrive ut ihht. oppgaveteskten. Alltid en god start å få samme output som oppgaven krever.

Det er jo akkurat det jeg trenger hjelp til.

Lenke til kommentar
Poenget er kanskje å studere scheduleren til linux. Når jeg kjører programmet kommer outputen fra hver prosess blokkvis(altså bytter prosessene på å kjøre litt).

 

Hva er poenget mes sleep(20)?

 

Du har nok helt rett i det, fikk ordnet koden slik at den så ut som den skal. Men nå har jeg kommet til en annen oppgave (som ser enda vanskeligere ut)...

 

Tilslutt kan du prøve å overføre argumenter til prosessene. I vårt tilfelle ønsker vi å starte opp

foreldre-prosessen på følgende måte:

foreldre barn antf antb

Første argument er foreldre-prosessen, andre argument er navnet til barne-prosessen, og de

to siste argumentene angir hvor mange ganger henholdsvis foreldre- og barneprosess skal

gå i løkka og skrive “Hu og hei...” og ”------------------------”.

Foreldre-prosessen mottar argumentene via argv, og sender dem videre til barneprosess ved

hjelp av f.eks. systemkallet execv. Sjekk med manualsidene. Du må gjerne prøve et annet av

systemkallene i exec-familien. Valget er ditt.

 

 

Noen som kunne kommet med noen eksempler på hvordan man skal bruke execv og argv?

Lenke til kommentar
Var den siste oppgaven for vanskelig eller kanskje den var for enkel for dere? :p

 

int execv(const char *path, char *const argv[]);]

 

Path er enten fullstendig eller relativ path fra der programmet kjøres. Eks:]

execv("./program", argv[2]);

 

^^ Vil starte programmet "program" og dytte argumentene fra argv[2] og utover til "program".

 

Edit: execv starter ikke en barneprosess men ERSTATTER den kjørende prosessen.

Endret av jurg
Lenke til kommentar
execv("./program", argv[2]);

 

^^ Vil starte programmet "program" og dytte argumentene fra argv[2] og utover til "program".

 

Hva var definisjonen av argv, sa du?

 

char **argv, evt. char*argv[] som er akkurat det samme. argv (både inn i main og som argument til execv) er en null-peker-terminert liste med pekere til pekere til chars. Hvordan det?

Edit: Så selvfølgelig skal det være argv+2, ikke argv[2] ;) Må slutte å hoppe mellom Java og C :\

Endret av jurg
Lenke til kommentar
char **argv, evt. char*argv[] som er akkurat det samme. argv (både inn i main og som argument til execv) er en null-peker-terminert liste med pekere til pekere til chars. Hvordan det?

Edit: Så selvfølgelig skal det være argv+2, ikke argv[2] ;)

 

Ja, det er derfor jeg lurte på det.

 

Wisd0m: du trenger "Advanced programming in the UNIX environment". Ikke fordi det du skal gjøre er så fryktelig avansert, men fordi APUE er en fremragende bok og dekker det du lurer på (og vel så det).

Lenke til kommentar
char **argv, evt. char*argv[] som er akkurat det samme. argv (både inn i main og som argument til execv) er en null-peker-terminert liste med pekere til pekere til chars. Hvordan det?

Edit: Så selvfølgelig skal det være argv+2, ikke argv[2] ;)

 

Ja, det er derfor jeg lurte på det.

 

Wisd0m: du trenger "Advanced programming in the UNIX environment". Ikke fordi det du skal gjøre er så fryktelig avansert, men fordi APUE er en fremragende bok og dekker det du lurer på (og vel så det).

 

Så absolutt en god bok, men om han ikke er interessert i å kode mye på linux / solaris / OS X / *BSD senere så er det en dyr investering :p

I første omgang burde han bli godvenn med manpages og ikke minst; google. Kanskje gå til innkjøp av K&R.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...