在主/从机上出现分段错误

时间:2018-10-10 00:34:16

标签: c segmentation-fault fork master-slave execvp

谁能向我解释为什么我在此代码上出现分段错误?我一直试图找出答案,并且在各种搜索中都空着。当我运行代码而不调用main(argc,argv)时,它将运行。从站仅将argv中的2个数字转换为整数,然后将其返回。谢谢。

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

int main(int argc, char* argv[])
{
    int i;
    int* sums;
    sums[argc];
    pid_t cpid;
    int status;
    char* args[10];
    int count = 1;

    for(i = 0; i < (argc / 2); i++) {
        cpid = fork();

        if(cpid == 0) {
            args[1] = argv[count];
            args[2] = argv[count + 1];
            execvp("./slave", args);
        } else {
            waitpid(cpid, &status, 0);
            sums[i] = WEXITSTATUS(status);

            printf("Child returned the number %d\n", sums[i]);
            sprintf(argv[i+1], "%d", sums[i]);
        }
        count += 2;
    }

    if(sums[0] == 0) {
        printf("done\n");
    } else {
        main(argc/2, args);
    }
}

1 个答案:

答案 0 :(得分:0)

第一个问题是您没有为sums分配任何内存,并且sums[i]访问了一个无用的位置。做到这一点:

 int sums[argc];

第二,对于execvp函数,参数数组必须具有 1. [0]-合法字符串。 2.最后一个元素[3]必须为NULL

       args[0] = "some-execution-file-name";
       args[1] = argv[count];
       args[2] = argv[count + 1];
       args[3] = NULL;

否则,该函数对数组的大小一无所知,而从站可能会在尝试读取元素[0]时死掉。