2016-06-24 11 views
-3

In LinuxÜbergeben Sie Argumente an neu erstellten Prozess

Ich habe Temp.c-Datei. zu, dass i

int main (int argc, char *argv[]) 
{ 
    if((cid1 = fork()) == 0) //child1 
    { 
     res = execv(proc1, &argv[1]); 
    } 
} 

Nun ist diese als kompilieren und ausführen

./a.out "arg1 arg2 arg3" 

Jetzt will ich diese arg1 passieren, neue arg2 und arg3 zu verarbeiten, dass i erstellt neuen Prozess und ich brauche alle Argumente zu übergeben erstellt, aber im Inneren, dass, wenn ich es mir 2 überprüfen argc zeigen statt 4

Warum diese Diskrepanz nur 1 Argument passieren, und ich habe innerhalb proc1, die Wert "arg1 arg2 arg3" ist aber hier möchte ich 3 Argument so argv[1] = arg1, argv[2]=arg2, argv[3]=arg3

Wie erreicht man das?

+0

Es klingt wie Sie möglicherweise das erste Programm falsch aufrufen. Haben Sie versucht, 'argc' im * ersten * Programm zu drucken? Es sollte 4 sein, aber ich wäre nicht überrascht, wenn es nur 2 ist, angesichts dessen, was Sie sehen. –

+4

Ok, genau das habe ich erwartet. Sie übergeben ein einzelnes Argument an das erste Programm, das heißt "arg1 arg2 arg3". Sie übergeben das gleiche Argument unverändert an das zweite Programm. Versuchen Sie, die Anführungszeichen aus der Befehlszeile zu entfernen. Auf diese Weise werden sie als separate Argumente übergeben. –

+0

Actulay ich muss diese doppelten Anführungszeichen verwenden, weil ich im realen Fall habe ich drei Prozess und 3 Argumente durch doppelte Anführungszeichen gruppiert ... –

Antwort

2

Sehr nützliches Beispiel bei https://support.sas.com/documentation/onlinedoc/sasc/doc/lr2/execv.htm

#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 

main() 
{ 
    pid_t pid; 
    char *const parmList[] = {"/bin/ls", "-l", "/u/userid/dirname", NULL}; 

    if ((pid = fork()) == -1) 
     perror("fork error"); 
    else if (pid == 0) { 
     execv("/bin/ls", parmList); 
     printf("Return not expected. Must be an execv error.n"); 
    } 
} 

Wie Sie execv() akzeptiert zwei Argumente sehen können. Der erste ist der ausführbare Dateiname. Die zweite ist ein Zeiger auf ein Array von Zeigern auf nullterminierte Zeichenfolgen und der NULL-Zeiger wird verwendet, um das Ende des Arrays zu markieren.

Erstellen Sie ein neues char * -Array, weisen Sie proc1 dem ersten Element (Index 0) und den erforderlichen Parametern den nächsten Elementen zu.