у вызова execve слишком мало аргументов, но он должен получать всю сумму - PullRequest
0 голосов
/ 06 июня 2019

Когда я выполняю вызов execve, я получаю сообщение об ошибке, я не понимаю, почему, когда я передаю в него массив char, он не принимает мой полный ввод и считает, что слишком мало аргументов. Эта программа предназначена для того, чтобы принимать имена файлов в качестве входных данных, а затем сортировать их в каталог с именем SORTED. Я знаю, что execve требует 3 аргументов, но я ошибаюсь в вызове?

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

int main( int argc, char **argv ){

    //arguments
    int i, status, finish = 1;
    pid_t *childPID;
    char buffer[256];

    //checks to make sure there is arguments 
    if ( argc < 2 ) {
        sprintf( buffer, "No arguments were given.\n" );
        write( 2, buffer, strlen( buffer ) );
        return (-1);
    }

    //uses mkdir to check if directory is there
    //if it is not, makes it with 0777 permissions 
    //if it exists, it prints out error message saying that
    //any other error happens, it uses perror to print out the error
    if(mkdir( "./SORTED", S_IRWXU ) == 0) {
        sprintf( buffer, "Creating SORTED folder with 0700 Permissions.\n" );
        write( 1, buffer, strlen( buffer ) );    
    }
    else if (errno == EEXIST) {
        sprintf( buffer, "SORTED folder already exists.\n" );
        write( 2, buffer, strlen( buffer ) );
    }
        else
            perror( "mkdir" );


    childPID = (pid_t*)malloc(sizeof(pid_t)*(argc));
    //for each argument, forks a new child from parent
    //calls execve, prints error if there is one
    //and then sleeps for 20 seconds before exiting
    for ( i = 1; i < argc; i++ ) {
        char output[256];
        sprintf( output, "SORTED/%s", argv[i] );
        char *newARGV[] = { "sort", "-o", output, argv[i], NULL };
        if ( childPID[i] = fork() == 0 ) {
            execve( "/usr/bin/sort", newARGV);
            perror( "execve" );
            exit( 0 );
        }    
    }

    //Goes through each argument, waits on the child PID
    //Prints if the sort was successful, and if not, prints error code
    for ( i = 1; i < argc; i++ ) {
        waitpid( childPID[i], &status, 0 );
        if ( status == 0 )
           sprintf( buffer, "%s : success (%d)\n", argv[i], status );
        else {
            finish = 0;
            sprintf( buffer, "%s : fail (%d)\n", argv[i], status );

        }
        write( 1, buffer, strlen( buffer ) );
    }

    //Prints the all done if there was no errors
    //informs you if there were errors
    if ( finish == 1 ) 
        sprintf( buffer, "All Done.\n" );
    else
        sprintf( buffer, "All Done. Error was encountered.\n" );
    write( 1, buffer, strlen( buffer ) );

    free(childPID);
    return 0;   
}

Полная ошибка:

error: too few arguments to function ‘execve’
       execve( "/usr/bin/sort", newARGV);

1 Ответ

0 голосов
/ 06 июня 2019

Функция execve ожидает три аргумента, но вы передаете два аргумента.Отсюда и сообщение об ошибке.

Похоже, у вас сложилось впечатление, что передача массива в функцию означает, что каждый элемент массива становится аргументом функции, но это не так.

Функция объявлена ​​следующим образом:

int execve(const char *filename, char *const argv[], char *const envp[]);

Первый аргумент - это команда для запуска, второй - массив аргументов, а третий - массив переменных среды.Если вы не заинтересованы в передаче переменных окружения, используйте execv вместо которого нет третьего аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...