Prozess starten der in Hintergund läuft.



  • #include <stdio.h>
    #include <unistd.h>
    
    char *argv[4],*env[2];
    argv[0]="/bin/ls";
    argv[1]="--color";
    argv[2]="/home";
    argv[3]="NULL";
    env[0]="LS_COLORS=fi=00:di=01";
    env[1]=NULL;
    execve("/bin/ls", argv, env);
    perror("execve() failed");
    

    oder

    execlp("ls","ls","-F","/home",NULL);
    

    Das Beispiel stammt aus dem Buch C und Linux von Martin Gräfe
    und ich find es ist kein so großer Schinken und enthält viele nützliche Dinge...
    🙂



  • Hi,

    mit "meiner" routine gibt es ein dickes problem. Wenn das shell-script zuende ist, bleibt es als Zombie im system. Wenn ich dann dem Parent kille, dann verschwinden auch die ganzen Zombies. Hat da vielleicht einer ne idee???

    So sieht es aus. 59 processes: 51 sleeping, 2 running, 6 zombie, 0 stopped

    MfG

    PS.:root 6701 0.7 0.0 0 0 pts/0 Z 17:11 0:00 [sh <defunct>]



  • du musst für jedes fork, nachdem der Prozess zu Ende ist, irgend wann ein man: wait(2) aufrufen. Sonst bleibt der "Zombie" übrig.



  • Thx,

    aber mit wait(2); bekomme ich einen compilererror und wait(0); wartet bis der prozess fertig ist. Nun weiss ich nichtmehr weiter.

    Hier mal die Fehlermeldung: error: incompatible type for argument 1 of `wait'

    MfG und Thx



  • |JayDee| schrieb:

    aber mit wait(2); bekomme ich einen compilererror und wait(0); wartet bis der prozess fertig ist. Nun weiss ich nichtmehr weiter.

    Klick das man: wait(2) mal an. Der Zweier heißt nur, dass Du in Sektion 2 Deiner Manpages Hilfe findest, nicht dass Du ihn als Argument übergeben sollst.



  • Ne kein wait, einfach
    vor dem fork
    signal(SIGCHLD, SIG_IGN);
    dann geht das



  • Puhh,

    das mit signal(SIGCHLD, SIG_IGN); klappt prima. Ich danke dir 1000mal. Ich werde mein prog hier im board dementsprechend abändern. Vieleicht braucht das mal einer.

    Gruss und nochmal fett Thx......



  • Ich hab da ewig recherchiert für...
    Ich wollte dir nur ne Menge arbeit ersparen.
    Vor allem weil man immer was zu wait findet obwohl man das in 99% der Fälle niemals braucht. man will ja nicht parralele Prozesse synchronisieren.



  • Procrash schrieb:

    Ne kein wait, einfach
    vor dem fork
    signal(SIGCHLD, SIG_IGN);
    dann geht das

    Das ist aber nicht portabel und laut POSIX undefined behaviour.

    http://www.faqs.org/faqs/unix-faq/faq/part3/section-13.html



  • Was heisst portable? Ich muss das über Crosscompiler machen. Ist für diese CPU.

    processor : 0
    cpu : 8xx
    clock : 67MHz
    bus clock : 67MHz
    revision : 0.0 (pvr 0050 0000)
    bogomips : 66.96

    Und ich muss sagen, es läuft bei mir einwandfrei.

    Deswegen MUSS ich das ja in c/c++ machen. Ich hatte schon nach Pascal gesucht. Aber für FreePascal gibt es leider nix.

    Gruss und gutes Nächtle 🙂


Anmelden zum Antworten