execve - No such file or directory?

前端 未结 2 1927
臣服心动
臣服心动 2021-01-14 13:20

I\'m having some problems with execve. I\'m trying to make a shell that can function just like the bash shell, but I have problems with the forked child executing a command.

相关标签:
2条回答
  • 2021-01-14 14:12

    The first thing I would do would be to insert:

    printf ("[%s]\n", path);
    

    before the call to execve. That should confirm that the executable is what you think it is.

    That code of yours looks okay as long as the input you're feeding into it is correct and the executable actually is available. For example, the following complete program works fine on my Debian box:

    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    
    int main (int argc, char *argv[]) {
        if (argc > 1) {
            char * word = strtok (argv[1], " ");
            char path[128] = "/bin/";
            strcat (path, word);
    
            char * newenvp[] = { NULL };
            char * newargv[] = { path, NULL };
            printf ("[%s]\n", path);
            int ret = execve (path, newargv, newenvp);
            if (ret == -1) {
                perror("execve error");
            }
        }
        return 0;
    }
    

    outputting, when I run ./testprog ls, something along the lines of:

    [/bin/ls]
    kidsshares.ods  paxwords    birthdays    homeloantracking.gnumeric
    shares2011.ods  backup0.sh  development  lexar
    accounts.ods    backup1.sh  photos       testprog.c
    testprog
    
    0 讨论(0)
  • 2021-01-14 14:15

    If you don't want to manually travel through the fileystem to find the correct binary, there is execlp (with an additional p). From the manpage:

    The execlp(), execvp(), and execvpe() functions duplicate the actions of the shell in searching for an executable file if the specified filename does not contain a slash (/) character. The file is sought in the colon-separated list of directory pathnames specified in the PATH environment variable. If this variable isn't defined, the path list defaults to the current directory followed by the list of directories returned by confstr(_CS_PATH). (This confstr(3) call typically returns the value "/bin:/usr/bin".) [...]

    0 讨论(0)
提交回复
热议问题