views:

198

answers:

3

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 should 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;

}

+3  A: 

The first entry in the args array should be the program name again. Your code calls /bin/ls with --help as the process name.

Geoff Reedy
shadyabhi
Yes. Also, `args[2]` must be `NULL`, which you do already.
ephemient
+1  A: 

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.

tommieb75
+1  A: 

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.

Miguel Ventura
ok .. i changed the code a bit... now pls tell.. i think there is some problem in giving argument to execve()
shadyabhi