无法成功使用“execve()”

时间:2010-02-02 17:38:27

标签: c exec fork systems-programming

该程序的目的是分叉一个新的子进程并执行一个也有命令行参数的进程。如果我输入/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 个答案:

答案 0 :(得分:3)

args数组中的第一个条目应该是程序名称。您的代码使用/bin/ls作为进程名称调用--help

答案 1 :(得分:1)

请检查以确保args电话不会导致realloc被破坏。关于realloc

,请参见此处

修改 循环看起来很有趣...... 你这样叫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复制字符串....

希望这有帮助, 最好的祝福, 汤姆。

答案 2 :(得分:1)

您的程序有一些明显的错误。例如,声明char **args=NULL;然后args=realloc(args,sizeof(char)*10);(因为它是char**,你应该 alloc -ing到char*,不是吗?..)

由于sizeof(char*)通常为4,而sizeof(char)通常为1,因此您最终会遇到一些严重的内存管理问题(您分配的内容少于您使用的内容,并最终写到您不应该写的地方' T)。从那以后,所有地狱都破裂了,你不能指望你的程序的行为有任何意义。

我建议你通过Valgrind这样的工具来运行你的程序,以找出内存泄漏并正确地纠正程序。一旦内存问题得到纠正,您的execve问题可能会消失。