我的任务是编写一个简单的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成功后继续运行?
答案 0 :(得分:4)
exec family函数不会终止您的进程。他们将现有流程图片替换为图片。
基本上,它的工作原理就是,该进程(以及它的PID和相关的内核资源)保持不变,除了旧映像中的所有代码都被删除并被程序中的代码替换,然后加载到内存中初始化就好像它是一个新进程一样。 PID不会更改,因此如果要创建具有自己的PID的子进程,则必须使用其他函数。
正确的方法是首先fork,然后使用子进程中的exec *。这样,您可以使用父实例中的wait函数来等待子进程终止并重新获得控制权。
+--------------+ +--------------+ +----------------------+
|Parent process|+---fork()-->|Parent process|+---------wait()------------>|Parent process resumes|
+--------------+ + +--------------+ +----------------------+
| +
| |
| |
| +-------------+ +-----------------+ |
+----->|Child process|+--execv()--->|New process image|+--exit--+
+-------------+ +-----------------+
答案 1 :(得分:2)
各种形式的exec()实际上用当前的过程映像替换。它们不会产生新的进程。所以你需要自己使用fork()。