【发布时间】:2019-10-15 02:22:17
【问题描述】:
我在尝试通过 execvp() 运行多个命令时遇到问题。为此,我有一个 while 循环遍历每个命令,解析它,然后调用一个函数来使用 fork + exec。
问题是,我将运行 fork + exec,当我等待 exec 通过时,父级运行并继续到第二个循环,即。第二个命令。但是,据我了解,发生的情况是上一个循环中的子进程接管,突然间,子进程就是当前进程。
如何在子进程中运行进程,但在父进程中保持控制?我在 SO 上看到的所有示例都是父进程在继续之前等待子进程终止,但我在这个分配中没有选择 - 我应该让子进程保持运行并稍后检查看看它们是否还在运行。
这是我思考过程的一些伪代码:
funct forkprocess() {
//call fork
//call execvp within child process, let process run and return control to parent
//if execvp failed, kill child process
//return child pid
}
int main() {
while(not end of file containing list of commands) :
//parse command for execvp call
//call forkprocess() to run process
//if childpid is returned, report it and store pid
//else, report failure
}
}
我的输出接近于以下:
\\parent PID is printed
\\any code outside the if-else ladder for fork is printed
\\it jumps back to main and prints any statements there
[jumps to next iteration in loop, ie. the next command]
\\child PID is printed
\\parent PID is printed
\\any code outside the if-else ladder for fork is printed
\\it jumps back to main and prints any statements there
\\child PID is printed
【问题讨论】:
-
How do you run a process in the child process, but maintain control in the parent?。这意味着什么? “控制”是什么意思?您是否试图确保父母不会让出处理器?您是否试图确保在创建所有孩子之前不会开始执行第一个孩子?您是否试图确保所有孩子都按特定顺序运行? -
“当前进程”是什么意思?如果您有多个处理器,并且多个子进程处理所有正在运行并将数据写入您的 tty ......那么您将获得交错输出。听起来您正在寻找一种同步机制。
-
在
fork()调用中,我尝试在子进程中调用exec(),exec()是我尝试运行的命令(例如ls a)。但是,我只想运行exec(),然后返回父进程继续运行更多子进程以获取我拥有的更多命令。同时,子进程只是在后台继续运行。希望这是有道理的,我无法解释它。 -
调用fork后,父子进程同时运行。如果孩子执行“ls”,那么它会将输出写入其标准输出,这可能是您调用程序的终端。父级仍在运行(除非它因某种原因退出)并产生更多子级。仅仅因为孩子正在向 tty 写入输出并不意味着它已经“接管[n]”。
-
你所说的某些东西引起了点击,所以我回去修复了一些东西。现在我可以看到您所指的行为。现在的问题似乎是在
while循环的第一次运行中,它似乎只通过了父代码时钟。直到第二次运行while循环(应该用于第二个命令),第一次运行的子进程才开始运行。有什么办法可以解决这个延迟吗?
标签: c process fork execvp waitpid