我在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");
答案 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() exec
。 vfork
复制进程,在副本中继续,并在完成执行时继续主进程。副本可以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