Получение ошибки сегментации на ведущем / ведомом

может ли кто-нибудь объяснить мне, почему я получаю ошибку сегментации в этом коде? Я пытался разобраться в этом, и в различных поисках ничего не получалось. Когда я запускаю код без вызова main (argc, argv), он запускается. Slave только преобразует 2 числа в argv в целые числа, а затем возвращает их. Спасибо.

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

person Christian Mcdermott    schedule 10.10.2018    source источник
comment
Список аргументов должен заканчиваться указателем NULL, и, поскольку это функции с переменным числом аргументов, этот указатель должен иметь приведение (char *) к NULL.   -  person Stargateur    schedule 10.10.2018


Ответы (1)


Первая проблема заключается в том, что вы не выделили память для 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;

В противном случае функция не имеет представления о размере массива, и подчиненное устройство может умереть, пытаясь прочитать element [0].

person Serge    schedule 10.10.2018