Невозможно успешно использовать "execve ()" - PullRequest
0 голосов
/ 02 февраля 2010

Целью программы является создание нового дочернего процесса и выполнение процесса, который также имеет аргументы командной строки. Если я введу /bin/ls --help, я получу ошибку:

shadyabhi@shadyabhi-desktop:~/lab/200801076_lab3$ ./a.out
Enter the name of the executable(with full path)/bin/ls --help
Starting the executable as a new child process...
Binary file to be executed: /bin/ls
/bin/ls: unrecognized option '--help
'
Try `/bin/ls --help' for more information.
Status returned by Child process: 2
shadyabhi@shadyabhi-desktop:~/lab/200801076_lab3$

Какой будет правильный аргумент для execve()?

#include<stdio.h>
#include<string.h>      //strcpy() used
#include<malloc.h>      //malloc() used
#include<unistd.h>      //fork() used
#include<stdlib.h>      //exit() function used
#include<sys/wait.h>    //waitpid() used

int main(int argc, char **argv)
{
    char command[256];
    char **args=NULL;
    char *arg;
    int count=0;
    char *binary;
    pid_t pid;
    printf("Enter the name of the executable(with full path)");
    fgets(command,256,stdin);
    binary=strtok(command," ");
    args=malloc(sizeof(char*)*10);
    args[0]=malloc(strlen(binary)+1);
    strcpy(args[0],binary);
    while ((arg=strtok(NULL," "))!=NULL)
    {
        if ( count%10 == 0) args=realloc(args,sizeof(char*)*10);
        count++;
        args[count]=malloc(strlen(arg));
        strcpy(args[count],arg);
    }
    args[++count]=NULL;
    if ((pid = fork()) == -1)
    {
        perror("Error forking...\n");
        exit(1);
    }
    if (pid == 0)
    {
        printf("Starting the executable as a new child process...\n");
        printf("Binary file to be executed: %s\n",binary);
        execve(args[0],args,NULL);
    }
    else
    {
        int status;
        waitpid(-1, &status, 0);
        printf("Status returned by Child process: %d\n",WEXITSTATUS(status));
    }
    return 0;
}

Ответы [ 3 ]

3 голосов
/ 02 февраля 2010

Первая запись в массиве args снова должна быть именем программы. Ваш код вызывает /bin/ls с --help в качестве имени процесса.

1 голос
/ 02 февраля 2010

В вашей программе есть очевидные ошибки.Например, объявив char **args=NULL;, а затем args=realloc(args,sizeof(char)*10); (так как char**, вы должны быть alloc -ing для char*, no? ..).

Так как sizeof(char*) - это обычно 4, а sizeof(char) - обычно 1, у вас возникают серьезные проблемы с управлением памятью (вы выделяете меньше, чем используете, и в итоге пишете там, где не должны).С этого момента все чертовски разрушается, и вы не можете ожидать, что поведение вашей программы будет иметь какой-либо смысл.

Я бы посоветовал вам запустить вашу программу через утилиту, например Valgrind , чтобывыяснить утечки памяти и исправить программу соответствующим образом.Возможно, ваши execve проблемы исчезнут, как только проблемы с памятью будут исправлены.

1 голос
/ 02 февраля 2010

Пожалуйста, убедитесь, что args не засоряется вызовом realloc.Смотрите здесь на SO относительно realloc

Edit: Также цикл выглядит забавно .... Вы назвали strtok вот так:

binary=strtok(command," ");

Измените конструкцию цикла, чтобы вместо нее использовать binary, как показано ...

char *tmpPtr;
while (binary != NULL){
   if ( count%10 == 0) tmpPtr=realloc(args,sizeof(char)*10);
   if (tmpPtr != NULL) args = tmpPtr;
   count++;
   args[count-1]=malloc(strlen(binary)+1);
   strcpy(args[count-1],binary);  
   binary = strtok(command, " ");
}

И использовать binary для копирования строки ....

Надеюсь, это поможетС наилучшими пожеланиями, Том.

...