C中指针和子进程的问题

时间:2015-10-07 21:42:50

标签: c pointers fork execl

每次运行此代码时,0' s和null作为我的子进程的参数传入。我知道它与指针有关,但我似乎无法填充我的数组并传递参数。我已经看了太久了,我希望有人能发现一个愚蠢的错误。

/* 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;
}

1 个答案:

答案 0 :(得分:0)

这是execl的声明:

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

以下是arg...的说明:

   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.

因此,在您的代码中,您传递了procpathprocname哪些是正确的,但您对input的使用不正确,execl没有指向int,但是指向以null结尾的字符串的指针。

您需要将input更改为char *input[size],然后在input中为每个条目分配内存,然后将参数作为字符串写入其中,如下所示:

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);