[C] Fork-en

Pagina: 1
Acties:

  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 22-02 20:56

Emiel1984

Made in NL

Topicstarter
Het is de eerste keer dat ik een programma wil gaan forken maar ik krijg het niet voor elkaar om het op de juiste manier te doen.

Ik heb op het internet gelezen dat de fork() het programma opsplitst in 2 afzonderlijke programma's(Parent en child) en de child verdergaat waar de fork is aangeroepen. De waardes die voor de fork zijn gegeven aan variabelen, zouden meegegeven worden aan het child-proces(zoals ik had gelezen).

Wanneer ik simpel een fork() toepas na de foutcontrole wordt er echter 2 maal het 'parent-gedeelte' aangeroepen inplaats van 1 keer. Ik heb hieronder mijn uiteindelijke bedeoling neergezet. De bedoeling is dat ik zelf kies met een integer hoevaak ik het programma fork().

De aanroepcode is zeg maar;
"./programma a b c d"

en dan wil ik dus dat elke child een letter afdrukt en de parent de eerste letter a. Ik hoop dat jullie kunnen zien wat ik fout doe want ik snap even niet meer wat ik fout doe. Mischien ben ik er te lang mee bezig :+ .


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>


int main(int iNumArguments, char *apcArguments[])
{
    
    pid_t fork_return;
    int iFout, iAantal, iLetter=3;
    const int iPid=(int)getpid();
    char cDrukaf1;
    
    printf("\nPID before Fork(): %d\n", iPid);
    printf("iLetter: %d\n", iLetter);
    
    if(iNumArguments >= 4)
    {
       printf("Inifloop\n");
        do
        {
        fork_return=fork();
        printf("PID after fork %d\n", (int)getpid());
        printf("iLetter: %d\n", iLetter);
        iLetter++;
        }while(iLetter < iNumArguments && iPid==(int)getpid());
    }
    

    iFout=TestCall(iNumArguments, apcArguments);  //Foutcontrole van aanroep.

    if(iFout == No_Errors) 
    {

        sscanf(apcArguments[1], "%d", &iAantal);

        switch(fork_return)
        {
           
           case -1:
           {
            printf("Forken heeft gefaalt");
            
           }
           case 0:
           {
            printf("PID child: %d\n\n", getpid());          

            }
            default:
            {

            printf("PID Parent: %d\n", getpid());

             }
        }

[ Voor 23% gewijzigd door Emiel1984 op 09-04-2006 18:20 ]

[LTS][MTS][HTS]


Verwijderd

Een fork ziet er meestal zo uit (c++):

C:
1
2
3
4
5
6
7
8
9
10
11
if ((int r = fork()) == 0) {
  /* Child code */
}
else {
  if (r != -1) {
    /* Parent code */
  }
  else {
    printf("Oeps, fork mislukt\n");
  }
}


Jouw programma zou ik denk ik zo schrijven (ongetest en geen foutafhandeling):

C:
1
2
3
4
5
int main(int argc, char* argv[]) {
  for (int i = 1; i < argc; i++) {
    if (fork() == 0) { printf("%s\n", argv[i]); exit(0); }
  }
}

[ Voor 9% gewijzigd door Verwijderd op 09-04-2006 18:30 ]


  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 22-02 20:56

Emiel1984

Made in NL

Topicstarter
Sorry mensen ik heb zo een stomme fout gemaakt. Ik ben gewoon de "break;" achter elke case vergeten en nu werkt het als een zonnetje. Dus de uitvoer van de fork is wel okey OneOfBorg, thks anyway. de code is dus hetzelfde als heirboven maar dan met de breaks. Bij een case is het trouwens ook niet nodig om " { " en " }" haakjes te plaatsen :p. Tjah zo los je ineens zelf je probleem op.


Edit1:
PS: De parent moet natuurlijk wel wachten tot alle childs uitgespeelt zijn dus mocht je de code gebruiken dan moet je niet vergeten bij de parent de wait() net zo vaak uit te voeren als je childs hebt gemaakt.

[ Voor 46% gewijzigd door Emiel1984 op 09-04-2006 18:58 ]

[LTS][MTS][HTS]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

emiel1984 schreef op zondag 09 april 2006 @ 18:40:
Sorry mensen ik heb zo een stomme fout gemaakt.
Je bedoelt "heeft gefaald" met een 't' schrijven? ;)

  • Emiel1984
  • Registratie: Maart 2005
  • Laatst online: 22-02 20:56

Emiel1984

Made in NL

Topicstarter
Zoijar schreef op zondag 09 april 2006 @ 18:59:
[...]
Je bedoelt "heeft gefaald" met een 't' schrijven? ;)
Je kan t uit verschillende richtingen bekijken :+ . Je kan ook zeggen ' tjah t is weekend' of ' Op zondag mag je niet werken dus wordt je meteen gestraft' :P . Etc etc. lol

[LTS][MTS][HTS]


Verwijderd

emiel1984 schreef op zondag 09 april 2006 @ 18:40:
Sorry mensen ik heb zo een stomme fout gemaakt. Ik ben gewoon de "break;" achter elke case vergeten en nu werkt het als een zonnetje.
Misschien, maar je code is wel behoorlijk obfuscated, dus ik zou nu nog niet stoppen met eraan werken.
Pagina: 1