2015-10-07 1 views
0

Chaque fois que ce code est exécuté, les 0 et un null sont transmis en tant qu'arguments pour mon processus fils. Je sais que c'est quelque chose à voir avec les pointeurs, mais je ne peux pas sembler remplir mon tableau et transmettre les arguments. Je l'ai regardé trop longtemps et j'espère que quelqu'un peut repérer une erreur stupide.Problème avec des pointeurs et des processus enfants dans C

/* exec example * 
* for CS-350 */ 

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

int main(int argc, char *argv[]) 
{ 
    int pid,i; 
    int sum; 
    int total = 0; 
    char *procpath = "slave"; 
    char *procname = "slave"; 

    int size = argc-1; 

    int input[size]; 


    int k; 
    for (k = 0; k < size; k++) 
    { 
     int m = (strtol(argv[k + 1], NULL, 10)); 
     // printf("%d", m); 
     input[k] = m; 
     printf("%d", input[k]); 
    } 
    // size = (size + 1)/2; 
    int count = 0; 

    while (size > 1) 
    { 

     for (i = 0; i < size; i = i + 2) 
     { 
      // create a child process 
      pid = fork(); 
      if (pid == 0) 
      { 

       // child process execution code--shows exec family calls 
       if (i < argc - 1) 
       { 
        execl(procpath, procname, &input[i], &input[i + 1], pid,(char *) 0); 
       } 
       else 
       { 
        execl(procpath, procname, &input[i], 0, pid, (char *) 0); 
       } 
       // execvp(procname,argv); 
       // if exec returns, means the call has failed. 
       perror("execl failed to run slave program"); 
       exit(1); 
      } 
      else if (pid > 0) 
      { 
       // print out command line arguments 
       waitpid(-1, &sum); 
      } 
      else 
      { 
       printf("call to fork failed, no child\n"); 
       exit(-1); 
      } 
      sum = WEXITSTATUS(sum); 

      printf("MASTER: partial sum = %d, and the pid of my slave =  %d\n\n",sum,pid); 

      int l; 
      for (l = 0 ; l < sizeof(input)/sizeof(input[0]) ; l ++) 
      { 
       printf("\n%d\n", input[l]); 
      } 
      // printf("%d", input[i/2]); 
      input[(i + 1)/2] = sum; 
      // printf("%d", input[i/2]); 
     } 
     size = (size + 1)/2; 
    } 
    printf("MASTER: total sum = %d\n",input[0]); 
    exit(0); 
} 

/* exec example-- slave * 
* for CS-350   */ 

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

int main(int argc, char *argv[]) 
{ 
    printf("hey whats up %s",argv[1]); 
    int f = strtol(argv[1], NULL, 10); 
    int s = strtol(argv[2],NULL,10); 
    int sum = f + s; 
    printf("I'm the slave my pid is %s\n",argv[3]); 
    printf("SLAVE: first argumement = %d, second argument = %d, sum = %d\n", f, s, sum); 

    return sum; 
} 
+0

Peut-être que vous pouvez ajouter ce que votre look de comportement souhaité aime aider les autres à vous aider. – xiamx

+1

Lisez la page de manuel pour [execl] (http://linux.die.net/man/3/execl). Il indique clairement que chacun des arguments après le chemin doit être "des chaînes terminées par zéro qui représentent la liste d'arguments". Vous passez un mélange de pointeurs à des entiers et des entiers, pas à des chaînes à terminaison nulle. – kaylum

Répondre

0

est ici la déclaration de execl:

int execl(const char *path, const char *arg, ...); 

Et voici la description arg et ...:

The const char *arg and subsequent ellipses in the execl(), execlp(), 
    and execle() functions can be thought of as arg0, arg1, ..., argn. 
    Together they describe a list of one or more pointers to null-termi‐ 
    nated strings that represent the argument list available to the exe‐ 
    cuted program. The first argument, by convention, should point to the 
    filename associated with the file being executed. The list of argu‐ 
    ments must be terminated by a null pointer, and, since these are vari‐ 
    adic functions, this pointer must be cast (char *) NULL. 

Donc, dans votre code, vous passez procpath et procname qui sont corrects, mais votre utilisation de input est incorrecte, execl ne prend pas le point ers à int, mais pointeur vers des chaînes terminées par un caractère nul.

Vous devez changer input être char *input[size], puis allouer de la mémoire pour chaque entrée input avant d'écrire vos arguments en tant que chaîne, quelque chose comme ceci:

char *input [size]; 
/* .... */ 
int bytes = snprintf (NULL, 0, "%d", m); 
input [k] = malloc (bytes + 1); 
assert (input [k] != NULL); 
snprintf (input [k], bytes + 1, "%d", m); 
+0

Les args sont déjà dans 'argv'. Ne vaudrait-il pas mieux conseiller OP de l'utiliser plutôt que de passer par les cerceaux de conversion en int, allouer de nouveaux tampons et le convertir en une chaîne? – kaylum