这个问题已经有了答案:
Does the C execv() function terminate the child proccess?
4个答案
Differences between fork and exec
9个答案
我的任务是编写一个简单的linux shell。我在执行外部命令。我们需要使用execv。
for (int i = 0; i < count; i++){
char path[1024];
strcpy(path, PATHS[i]); // PATHS is an array of cstrings, the paths in $PATH
strcat(path, "/");
strcat(path, command[0]); // command and commands are essentially the same
printf("%d %s",i,path); // they are essentially argv[]
if (!execv(path, commands)) // for ls -l $HOME
break; // commands[0] = ls [1] = -l [2] = my home dir
现在我只是用LS测试。ls运行正常,但execv成功后程序立即关闭。有没有办法让我继续使用execv来检查正确的路径,并在execv成功后继续运行程序?
最佳答案
函数的exec family不会终止进程。它们替换现有的进程映像和执行的映像。
基本上,它的工作原理是,这个进程(带有它的pid和相关的内核资源)保持不变,只是旧映像中的所有代码都被删除,并被程序中的代码替换,然后加载到内存中并初始化,就好像它是一个新进程一样。pid不会改变,因此如果要创建具有自己的pid的子进程,则必须使用另一个函数。
正确的方法是先fork,然后从子进程中使用exec*。这样,您就可以在父实例中使用wait函数来等待子实例终止并恢复控制。
+--------------+ +--------------+ +----------------------+
|Parent process|+---fork()-->|Parent process|+---------wait()------------>|Parent process resumes|
+--------------+ + +--------------+ +----------------------+
| +
| |
| |
| +-------------+ +-----------------+ |
+----->|Child process|+--execv()--->|New process image|+--exit--+
+-------------+ +-----------------+
关于c - 如何防止execv杀死我的程序? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21452029/