Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hi

Hab ein problem mit fork(). Hab ein prog geschrieben(einen server) der sobald ein client conneced einen child prozess starten soll der den client übernimmt und der parent prozess soll immer nur lauschen ob nicht eine anfrage von einem client kommt. Hab das mit fork so gelöst:

Das ist jetzt nur ein ausschnitt aus dem code(der der den fork ausführt und noch die schleife dazu)



 for(; 

        {

                printf("In der FOR schleife\n");

        cli_size =sizeof(cli);

                c=accept(s,(sockaddr*)&cli, &cli_size);

                if (c== -1)

                {

                        perror("accept() failed");

                        return 5;

                }


        if(fork()==0) // Wenn ich child bin dann...

        {        

        printf("FORK == 0\n");

        printf("client from %s\n",inet_ntoa(cli.sin_addr));

                if(handling(c) == -1)

                      {  printf("handling() failed"); }//if

        close(c);

        }//if

    else // Ich bin parent

        {

        printf("FORK != 0\n");

        close(c);


        }//else

        return 0;   

    }//for

[/code]




Wie ihr seht wird wenn man child ist die funktion handling() aufgerufen...

Glaub zwar nicht das hier der fehler liegt aber trozdem mal der code:



[code] int handling(int c) { printf("HANDLING WIRD GESTARTED\n"); char buffer[BUFFER_SIZE], name[BUFFER_SIZE]; int bytes; FILE *stream; strcpy(buffer, "Your Data: "); bytes= send(c,buffer, strlen(buffer), 0); if (bytes == -1) return -1; bytes=recv(c,data,sizeof(data),0); if (bytes==-1) return -1; data[bytes] = '\0'; if((stream=fopen("DATEN","a+")) == NULL) { if((stream=fopen("DATEN","w+")) == NULL) { sprintf(buffer,"Error while writing Data in File\r\n"); bytes=send(c,buffer,strlen(buffer),0); }//if else { sprintf(buffer,"Created file and wrote data in it\r\n"); bytes=send(c,buffer,strlen(buffer),0); fclose(stream); k//else }//if else { fprintf(stream,data); fclose(stream); sprintf(buffer,"Wrote data in existing file\r\n"); bytes=send(c,buffer,strlen(buffer),0); if (bytes==-1) return -1; }//else return 0; }//handling

Jetzt mal eine gnaue problembeschreibung:

Server started ganz normal.

Client connected.

ich bekomm die meldung fork==0 und fork!=0 also hab ich nen parent und nen schild prozess.

Aber sobald das handling gestarted wird schließt sich ein prozess(der parent warscheinlich) und ich kehre in die konsole zurück. Ich kann dennoch noch daten mit dem client schicken und diese werden auch in das file geschrieben. Sobald die daten gesendet sind diesconnecred der client und der destruktor des child prozesses wird aufgerufen.

Jetzt befindet sich das prog in einer endlosschliefe oder hat sich aufgehängt jedenfalls läüft irgendwas aber ich kann nichtmehr connecten.

Hoffe ihr könnt mir helfen denn ich ärgere mich schon seit 3 tagen mit dem fork herum und versteh nicht warum er den parent prozess beendet.Hab auch schon in diesem(und anderen) foren was zu fork() gesucht aber nichts gefunden das mein problem erklären würde.

mfg sAuRoN

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.