0

このコードが実行されるたびに、子プロセスの引数として 0 と 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;
}
4

1 に答える 1

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.

procpathそのため、コードではandを渡しますが、procnameこれは正しいですが、の使用inputは正しくありexeclません。int へのポインターではなく、null で終わる文字列へのポインターを使用します。

inputbeに変更してから、次のように引数を文字列として書き込む前に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);
于 2015-10-07T22:19:02.463 に答える