在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");
不可以。一个成功的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
返回,总是因为错误,所以要准备好处理错误。
不,使用exec系列函数是不可能的,因为从前面的代码生成的可执行文件,即包含execlp(“ls”,“ls”,“ – l”,NULL)函数的代码被替换为可执行文件将由execlp()函数运行,即ls 。 所以当这个函数成功执行的时候,你不再有那个包含execlp()函数的旧的可执行文件。
使用系统(“ls -l”); 函数,如果你想运行任何其他进程,并希望返回到当前进程。
exec
系列函数用新的过程映像替换当前进程。 如果你不想这样做,你需要在调用exec
之前进行fork
,这样你的进程的新分叉副本被替换(而不是原来的替换)。
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");
exec
用一个新的过程映像替换当前的过程映像,所以, 不 ,这是不可能的。
如果你想回到以前的工作,你可以做一个分支,并从子进程调用一个exec。
if (fork() == 0){ //this part will only be executed by the child process execlp("ls","ls", "-l", NULL); wait((int*)0); }
实际上, exec()
或者它的函数族取代了当前的进程并执行
因此,在子进程中尝试fork并使用exec()
,然后在父进程中等待,直到子进程终止。
喜欢这个 :
if(!fork()) { // In child execlp("ls","ls","-l",NULL); } wait(NULL); // In parent //rest of code