Reputation: 17234
The aim of the program is to fork a new child process and execute a process which also has command line arguments. If I enter /bin/ls --help
, I get the error:
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$
What would be the right argument to 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;
}
Upvotes: 0
Views: 3034
Reputation: 10458
Your program has some obvious errors. For instance, declaring char **args=NULL;
and then args=realloc(args,sizeof(char)*10);
(since it's char**
, you should be alloc-ing to char*
, no?..).
Since sizeof(char*)
is usually 4 while sizeof(char)
is usually 1, you end up with some serious memory management problems around there (you alloc less than you use, and you end up writing where you shouldn't). From there on, all hell breaks loose and you can't expect your program's behavior to make any sense.
I'd suggest that you run your program through an util such as Valgrind to figure out memory leaks and correct the program appropriately. Probably your execve
problems will disappear as soon as the memory problems are corrected.
Upvotes: 1
Reputation: 34592
Please check to make sure args
is not getting clobbered by the realloc
call. See here on SO regarding realloc
Edit:
Also the loop looks funny....
You called strtok
like this:
binary=strtok(command," ");
Change the loop construct to use binary
instead as shown...
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, " "); }
And use the binary
for copying the string....
Hope this helps, Best regards, Tom.
Upvotes: 1
Reputation: 36011
The first entry in the args array should be the program name again. Your code calls /bin/ls
with --help
as the process name.
Upvotes: 3