• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 363
  • Last Modified:

Execvp function

I have written  a program to parse user commands and send them to execvp to execute, which it does, but after the execvp nothing happens. I want it to print out a message, but it just gets stuck. Am I missing something after the execvp call?
#include <stdio.h>
#include <string.h>
 
int main(int argc, char *argv[])
{
char comm[100];
char *pnt[100];
int i=0;
int pid;
int status;
 
if (argc==1 ||  argc >2){
printf("Incorrect number of arguments. Exiting\n");
exit(0);
}
printf("%s ", argv[1]);
gets(comm);
 
pnt[i] = strtok (comm," ");
 
while (pnt[i] != NULL){
pnt[++i]=strtok(NULL," ");
}
if ((pid = fork()) < 0){
printf("Error unable to fork");
exit(1);
}
else if (pid == 0){
int count=1;
printf("Executing command no:%d\n",count);
execvp(*pnt,pnt);
printf("Command no. %d was executed\n",count);
count++;}
else{ while (waitpid(pid));
printf("Would you like to enter another command?");
exit(0);
}
}

Open in new window

0
wannabe_cpgeek
Asked:
wannabe_cpgeek
  • 2
  • 2
2 Solutions
 
mrjoltcolaCommented:
One thing you must understand about the exec*() functions. When you call it, the program you call actually _replaces_ the running program, in memory, so no lines of code after the exec() call will be executed, unless exec() failed.

To kick off a shell command like that you can use popen() or fork() + exec()

0
 
wannabe_cpgeekAuthor Commented:
So is there a way I can go back to my program and run the other commands?
0
 
mrjoltcolaCommented:
use popen() to run the commands. That opens the called program as a process and you can read from the "stream" just like reading from a FILE * (actually popen returns a FILE*).

Read the man page on popen or google for a sample.

0
 
wannabe_cpgeekAuthor Commented:
Thank you, but my assignment saids I have to use execvp, so is there a way using it?
0
 
Let_Me_BeCommented:
The answer was already supplied in the first reply. If you want to execute another process running in parallel with the original one, you must use a combination of fork and exec. Fork will create a copy of your running program, exec with replace the running program (use the child for this) with a new one.

Here is a more detailed overview: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
0

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now