Solved

Execvp function

Posted on 2009-07-06
6
280 Views
Last Modified: 2013-12-26
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
Comment
Question by:wannabe_cpgeek
  • 2
  • 2
6 Comments
 
LVL 40

Accepted Solution

by:
mrjoltcola earned 250 total points
Comment Utility
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
 

Author Comment

by:wannabe_cpgeek
Comment Utility
So is there a way I can go back to my program and run the other commands?
0
 
LVL 40

Expert Comment

by:mrjoltcola
Comment Utility
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
 

Author Comment

by:wannabe_cpgeek
Comment Utility
Thank you, but my assignment saids I have to use execvp, so is there a way using it?
0
 
LVL 12

Assisted Solution

by:Let_Me_Be
Let_Me_Be earned 250 total points
Comment Utility
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

6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

Join & Write a Comment

Suggested Solutions

Introduction: Ownerdraw of the grid button.  A singleton class implentation and usage. Continuing from the fifth article about sudoku.   Open the project in visual studio. Go to the class view – CGridButton should be visible as a class.  R…
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now