Zum Inhalt springen

C/C++/C#- Nachhilfe Thread


 Teilen

Empfohlene Beiträge

Schönen Nachmittag!

 

Ich hab ein kleines Problem bei einem C Programm.

 

Vereinfacht:

 

int main(int argc, char **argv)
{
       int i;
       for(i=0;i        {
               execlp("./Program1","Program1",NULL);
               printf("%i\n", i);

       }
       return 0;
}

 

Ich versteh nicht wiso "Program1" nur einmal ausgeführt wird, und der ganze Code danach nicht mehr berücksichtigt wird. Im Program1 steht nur das es ein Hello World ausgeben soll.

 

Hat das mit der Endbedingung, dem NULL am ende des execlp Befehls zu tun?

 

Lg Johannes

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich kann zwar absolut nimmer c programmieren, aber ein bissi googlen (sitz grad in der firma, da hat man zeit für solche scherze) hat folgendes ergebnis gebracht:

 

The list of arguments must be terminated by a NULL pointer, and, since these are variadic functions, this pointer must be cast (char *) NULL. (quelle: http://linux.die.net/man/3/execlp)

 

jetzt die vermutung (wie gesagt, ich hab seit mindestens 10 jahren kein c mehr programmiert): alles, was da irgendwie noch an code kommt, wird als input für dein Program1 aufgefasst.

 

hth

Link zu diesem Kommentar
Auf anderen Seiten teilen

auch bei mir ist die C-Zeit schon lange her, aber wenn mich nicht alles täuscht, wird mit exec der aktuelle Prozess gegen den aufgerufenen ausgetauscht - klar dass dann die Progammteile nach exec nicht mehr ausgeführt werden.

Mit "fork" kannst eine Kopie des aktuellen Prozesses machen und dann aus dem fork return value entscheiden ob Du jetzt das Original oder die Kopie bist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Norwegian hat Recht.

Die ganzen 'exec*'-Funktionen 'tauschen' den gerade laufenden Prozess gegen den aufgerufenen aus http://www.opengroup.org/onlinepubs/009695399/functions/exec.html.

Eine gute Quelle fuer die ganzen Standard-C und POSIX Funktionen ist die OpenGroup: http://www.opengroup.org/onlinepubs/009695399/

 

Funktionierender Code (aja, ich habe ihn nicht compiled, also keine Garantien ;) wuerde so aussehen:

#include 
#include 

int main (void)
{
   size_t i;

   for (i = 0; i     {
      pid_t process_id = fork ();
      /*  Fehlerhandling */
      if (process_id == 0) /* bin im Kindprozess */
      {
           execlp("./Program1","Program1",NULL);
      }
      else    /* bin im urspruenglichen Prozess */
      {
           printf ("%lu\n", i);
      }
  }

   return EXIT_SUCCESS;
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke euch allen ich habs bereits, Norwegians Tip war Gold wert.

R.C. danke auch dir, ich habs nur zu spät gesehen und hab mich stattdessen selber bissl gequält. :toll:

 

int main(int argc, char **argv)
{
       int i;
       int pid;
       int status;
       for(i=0;i        {
       pid=fork();
               switch(pid)
               {
                       case 0:
                               execlp("./fork_exec","./fork_exec",NULL);
                               break;
                       default:
                               pid=wait(&status);
               }
       }
       return 0;
}   

Edit: Sry für die scheiss Code-form, gehört sich nicht so.

Edit2: so jetzt isses besser

Link zu diesem Kommentar
Auf anderen Seiten teilen

R.C. danke auch dir, ich habs nur zu spät gesehen und hab mich stattdessen selber bissl gequält.

 

War eh besser, ich habe ja auf's 'wait' vergessen, dadurch war's ein Zombiegenerator :f:

 

Allerdings sollte dein 'pid' ein 'pid_t' sein, ist zwar normalerweise ein int, kann aber bei 64Bit System auch ein long (bzw. long long) sein. In echtem Code solltest du auch noch einen Fehlerstatus (Returnwert von -1) bei 'fork', 'execlp' und 'wait' abfragen, ist bei deinem Beispiel aber eh egal, weil wenn 'fork' fehlschlaegt 'wait' mit einem Fehlerstatus zurueckkehrt und nichts passiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 Monat später...

wusste doch wiso ich so einen allgemeinen Threadtitel geählt hab...

 

Frage: hat schon mal wer mit der opencv libary gearbeitet, wenn ja: ist es möglich mit der auch in einer C++ Windows Forms Anwendung damit zu arbeiten, ich schaffs nur in einer Konsolenanwendung zur zeit :(

 

Ich bekomm immer den Fehler:

Fehler 1 fatal error C1189: #error : ERROR: EMM intrinsics not supported in the pure mode! C:\Program Files\Microsoft Visual Studio 9.0\VC\include\emmintrin.h 27 sectry

und kann damit nüsse anfangen...

 

Wer sich da a bissl auskennt den schick ich gerne das .NET Projekt

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

 Teilen

×
×
  • Neu erstellen...