Wisd0m Skrevet 19. februar 2009 Del Skrevet 19. februar 2009 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 4Merk 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
Wisd0m Skrevet 19. februar 2009 Forfatter Del Skrevet 19. februar 2009 Noen som kunne gitt meg et pek i riktig retning i det minste? Lenke til kommentar
zotbar1234 Skrevet 19. februar 2009 Del Skrevet 19. februar 2009 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
Wisd0m Skrevet 19. februar 2009 Forfatter Del Skrevet 19. februar 2009 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
JeffK Skrevet 19. februar 2009 Del Skrevet 19. februar 2009 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)? Lenke til kommentar
Wisd0m Skrevet 20. februar 2009 Forfatter Del Skrevet 20. februar 2009 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
Wisd0m Skrevet 20. februar 2009 Forfatter Del Skrevet 20. februar 2009 Var den siste oppgaven for vanskelig eller kanskje den var for enkel for dere? Lenke til kommentar
jurg Skrevet 20. februar 2009 Del Skrevet 20. februar 2009 (endret) Var den siste oppgaven for vanskelig eller kanskje den var for enkel for dere? 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 20. februar 2009 av jurg Lenke til kommentar
zotbar1234 Skrevet 20. februar 2009 Del Skrevet 20. februar 2009 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? Lenke til kommentar
jurg Skrevet 20. februar 2009 Del Skrevet 20. februar 2009 (endret) 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 20. februar 2009 av jurg Lenke til kommentar
LostOblivion Skrevet 20. februar 2009 Del Skrevet 20. februar 2009 Hvilken skole er det snakk om? Hvilket fag? Lenke til kommentar
Wisd0m Skrevet 20. februar 2009 Forfatter Del Skrevet 20. februar 2009 HiST Operativsystemer med Linux Lenke til kommentar
zotbar1234 Skrevet 21. februar 2009 Del Skrevet 21. februar 2009 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
jurg Skrevet 21. februar 2009 Del Skrevet 21. februar 2009 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 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå