I’m trying to run the example from the Advanced Linux Programming book (Listing 3.4, page 51):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
/* Spawn a child process running a new program. PROGRAM is the name
of the program to run; the path will be searched for this program.
ARG_LIST is a NULL-terminated list of character strings to be
passed as the program’s argument list. Returns the process ID of
the spawned process. */
int spawn(char* program, char** arg_list) {
pid_t child_pid;
/* Duplicate this process. */
child_pid = fork();
if (child_pid != 0)
/* This is the parent process. */
return child_pid;
else {
/* Now execute PROGRAM, searching for it in the path. */
execvp(program, arg_list);
/* The execvp function returns only if an error occurs. */
fprintf(stderr, "an error occurred in execvp\n");
abort();
}
return 0;
}
int main() {
/* The argument list to pass to the "ls” command. */
char* arg_list[] = { "ls", /* argv[0], the name of the program. */
"-l", "/", NULL /* The argument list must end with a NULL. */
};
/* Spawn a child process running the "ls” command. Ignore the
returned child process ID. */
spawn(" ls", arg_list);
printf("done with main program\n");
return 0;
}
And I got:
an error occurred in execvp
done with main program
Any idea what’s wrong here? (Using Ubuntu 10.10)
As per Tom’s request:
The problem appears to be the (extra) space in the string that names the command.
Keep in mind that you are not calling the bash (shell) interpretor and giving it the string command. You are “naming” a command and in that respect it is analogous to naming a file, all characters are taken into account when comparing with the available commands (files).