执行功能。有没有办法回到主程序?

时间:2012-11-24 19:47:55

标签: c linux exec

我在ubuntu下遇到了exec()函数的问题。 有没有可能回到主程序?

示例:

printf("Some instructions at beginning\n");
execlp("ls","ls", "-l", NULL);

// i want to continue this program after exec and see the text below
printf("Other instructions\n");

6 个答案:

答案 0 :(得分:6)

没有。成功的exec调用当前程序替换为另一个程序。如果您希望父母和孩子都能留下来,则需要在exec之前致电fork(2)

pid_t childpid = fork();
if(childpid < 0)
{
    // Handle error
}
else if(childpid == 0)
{
    // We are the child
    exec(...);
}
else
{
    // We are the parent: interact with the child, wait for it, etc.
}

请注意,失败的exec调用(例如,给定的可执行文件不存在)会返回。如果exec返回,则总是因为错误,所以要准备好处理错误。

答案 1 :(得分:2)

不可以使用exec系列函数,因为可执行文件是从您之前的代码生成的,即包含 execlp的代码(&#34; ls&#34; ,&#34; ls&#34;,&#34; -l&#34;,NULL) 功能,由您将由 运行的可执行文件替换execlp() 功能即 ls 。 因此,当成功执行此功能时,您不再拥有包含 execlp() 功能的旧可执行文件。

如果要运行任何其他进程并希望返回当前进程,请使用系统(&#34; ls -l&#34;); 功能。

答案 2 :(得分:1)

exec 使用新的过程映像替换当前过程映像,因此,,这是不可能的

如果你想回到你以前做过的事情,你可以做一个分叉并从子进程中调用一个exec。

if (fork() == 0){ //this part will only be executed by the child process
        execlp("ls","ls", "-l", NULL);
        wait((int*)0);
}

答案 3 :(得分:1)

没有。 exec函数系列用新的过程映像替换当前进程。如果您不想这样做,则在调用fork之前需要exec,以便更新您的进程的新分叉副本(而不是替换原来的副本)。

答案 4 :(得分:1)

exec替换可执行文件图像。没有办法回来。一个不错的选择是vfork() execvfork复制进程,在副本中继续,并在完成执行时继续主进程。副本可以exec所需的文件。例如:

printf("Some instructions at beginning\n");
if(!vfork()){
    // child
    execlp("ls","ls", "-l", NULL); // child is replaced
}
// parent continues after child is gone
printf("Other instructions\n");

答案 5 :(得分:0)

实际上exec()或它的一系列功能取代当前流程并执行

所以在子进程中尝试fork并使用exec(),并在父进程中等待直到子进程终止。

像这样:

if(!fork())
 {
  // In child
  execlp("ls","ls","-l",NULL);
 }
 wait(NULL);
  // In parent 
 //rest of code