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. Here is what I have for the child. cmd is a char * with the command that the user typed in. However, when I run this program, I get this error from perror:
execve error: No such file or directory.
I have tried the program with a simple ls, and it should make path="/bin/ls" and execute it (I have confirmed this is where my ls command is) but it still complains. What am I doing wrong? Thanks!
CODE:
if(pid == 0){
// Parse the command
char * word = strtok(cmd, " ");
char path[128] = "/bin/";
strcat(path, word);
// Execute the process
char * newenvp[] = { NULL };
char * newargv[] = { path, NULL };
ret = execve(path, newargv, newenvp);
if(ret == -1){
perror("execve error");
}
return EXIT_SUCCESS;
}
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 first thing I would do would be to insert:
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:
outputting, when I run
./testprog ls
, something along the lines of: