fork probleme

Post Reply
Message
Author
blubb

fork probleme

#1 Post by blubb »

tag auch,
hab folgendes problem... ich wollte eine setup routine fuer ne livecd bauen (einfach blos root partition, swap und fs angeben - mkfs benutzen und alles rueberkopieren). soweit so gut... ist aber nich so einfach wie es sich anhoert (zumindest nicht fuer mich)...
wenn ich das program starte funktioniert es solang bis fork() kommt... dann springt das programm wirr in sich und arbeitet irgendwie immer irgendwelche teile (nicht sequentiell) ab. da der code etwas laenger ist paste ich nur mal einen kleinen teil:

Code: Select all

int build_partitions(part_table)
{
   char answer;
   pid_t kind;
   system("clear");
   printf("Your root partition is %s with filesystem %s\n", hdd_info.root, hdd_info.fs);
   printf("Your swap partition is %s\n", hdd_info.swap);
   printf("\n\tWhen you continue, you will lose _all_ data on these partitions \n");
   printf("Hit 'a' if you really want to continue...\n");
   fflush(stdin); fflush(stdout);
   getchar();
   scanf("%c", &answer);
   if(answer != 'a'&& answer != 'A')
     return 0;
   FILE *fp;
   fp = fopen("/mnt/edu", "r");
   if(!fp)
     {
        printf("creating /mnt/edu directory... ");
        system("mkdir /mnt/edu");
        printf("done\n");
     }
   else
     printf("/mnt/edu is available...\n");
   fclose(fp);
   printf("creating root partition... ");
   int status = 0;
   switch(kind = fork())
     {
      case -1: exit(0); break;
      case 0: execl("/sbin/mkfs", "mkfs", "-t", hdd_info.fs, hdd_info.root, (char *)0);
        printf("done\n"); exit(1);
      default: wait(&status); break;
     }

   printf("creating swap partition... ");
   switch(kind = fork())
     {
      case -1: exit(0); break;
      case 0: execl("/sbin/mkswap", "mkswap", hdd_info.swap, (char *)0);
        printf("done\n"); exit(1);
      default: wait(&status); break;
     }

   printf("setting up swap partition... ");
   switch(kind = fork())
     {
      case -1: exit(0); break;
      case 0: execl("/sbin/swapon", "swapon", hdd_info.swap, (char *)0);
        printf("done\n"); exit(1);
      default: wait(&status); break;
     }

   return 1;
}
die ausgabe sieht bei mir so aus:

Code: Select all

Hit 'a' if you really want to continue...
a
/mnt/edu is available...
Detaching after fork from child process 4659.
mke2fs 1.35 (28-Feb-2004)
/dev/hde5 is mounted; will not make a filesystem here!
Detaching after fork from child process 4660.
Setting up swapspace version 1, size = 2023378 kB
Detaching after fork from child process 4661.
swapon: /dev/hde7: Device or resource busy
Detaching after fork from child process 4662.
mount: /dev/hde5 already mounted or /mnt/edu busy
mount: according to mtab, /dev/hde5 is already mounted on /mnt/edu
Detaching after fork from child process 4663.
`./a.out' -> `/mnt/edu/./a.out'
`./psr.c' -> `/mnt/edu/./psr.c'
`./psr.c~' -> `/mnt/edu/./psr.c~'
creating root partition... creating swap partition... setting up swap partition... mounting /dev/hde5 with filesystem ext3 to /mnt/edu... lets copy the cd to hdd... EDU linux is now installed...
hier sieht man zb. das er erst kopiert bevor die ausgaben kommen... arbeite noch nich lang mit fork(), denk mal das is nur ein "denkfehler" oderso...

thx
blubb

tj

#2 Post by tj »

Hi,

ich weiss nicht genau, was dich stört, ist es nur die Reihenfolge der Ausgabe
in der Shell? Macht das Programm sonst, was es soll?

Im ersteren Fall:
Wenn du mit fork() arbeitest, dann ist es normal, denke ich, dass die Ausgabe
nicht synchron erscheint. Jeder Prozess kann ja in einen anderen Ausgabe-Puffer
schreiben, und wann dieser jeweils 'geflusht' wird ist wohl nicht vorhersagbar.

TJ

blubb

#3 Post by blubb »

hi,
ja ist schon komisch, wenn ich es von meinem system aus mach (slackware) kann ich super die partitionen formatieren und alles kopieren, ok die reihenfolge der ausgabe stoert nur optional (vorerst)...
aber wenn ich dann von cd boote und das versuch dann ist das problem das :
1) alles formatiert wird
2) alles rueberkopiert wird
3) wieder alles formatiert wird

das bringt also nicht wirklich viel
dachte mir mit wait koennte man das irgendwie beeinflussen oderso
bin auch nich wirklich bewandert was fork() angeht, kollege meinte schon ich soll mit threads arbeiten...
aber es kann doch nich sein das man dass nich steuern kann, oder?

blubb

tj

#4 Post by tj »

Spricht eigentlich was dagegen, mit der system()-Funktion zu arbeiten?
Oder, noch besser, einfach ein kleines shell-script zu benutzen?

TJ

blubb

#5 Post by blubb »

ja n sh script werd ich jetzt auch machen weil ich am verzweifeln bin und das nich gebacken krieg. ich wollt halt alles in c machen.
hab es jetzt versucht ueber die eingabe des fs's und der root partition etc. ein execstring[80]
zamzubastln mit strcat und das dann per system() auszufuehren. aber da hab ich das gleiche problem wie bei fork()... ich checks einfach nich

blubb

bfeater
Posts: 16
Joined: 08. May 2004 19:52

#6 Post by bfeater »

Hi!
Wenn man mit fork() arbeitet, dann ist es doch normal, dass die einzelnen Aufgaben bei dir nicht sequentiell abgearbeitet werden. Die Prozesse laufen alle gleichzeitig und da sie nicht gleich viel Zeit für die einzelnen Aufgaben benötigen, kommen auch die Meldungen, dass sie fertig sind nicht unbedingt in der passenden Reihenfolge!
Die system()-Funktion wäre hier das richtige, da sie bis auf die Beendigung des Befehls wartet. Oder aber du wartest mit waitpid(kind) auf die Beendigung der Prozesse, die du startest.
Threads würden dir hier auch nicht viel helfen. Sie arbeiten ähnlich wie Prozesse, nur haben sie im Gegensatz zu diesen einen gemeinsamen Adressraum und können auf gemeinsam Variablen benutzen. Aber hier würden Thread auch ihr Werk gleichzeitig verrichten.

MfG
bfeater

Post Reply