2016-03-08 23 views
-2

我需要创建一个程序,它接受来自用户的输入并执行它,就像它在终端中一样。我正在使用execvp()函数来达到此目的。该计划的要求是不断接受用户的输入,除非遇到quit调用。这里的问题是在拨打execvp()之后替换当前程序。因此,使用goto也不是一个选项。我发现这篇文章Fork–exec,但它没有说明如何创建无限数量的进程。这里是我的代码:如何在C中执行多个进程?

#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 

void main() { 

char *args[4]; 
char inputCommand[100]; 
fgets (inputCommand, 100, stdin); 
printf ("Splitting string \"%s\" into tokens:\n",inputCommand); 

/* Perfrom string tokenization here */ 

execvp(args[0], args); 
} 
+1

什么是bash的具体关于这个问题呢? (如果答案是“无”,为什么它有标签?) –

+0

...使用'execvp'不通过shell,所以你避免了相同的开销和风险。 –

+2

你是否熟悉while循环?这就是无限期地重复任何*任务的方式。 Fork-exec也不例外。 – ruakh

回答

2

fork()可以被称为不确定的次数;只要返回值指出你是父进程,就可以继续照常运行并再次调用它。

因此,如果您是子进程,您可以在其中创建一个循环,如果您是子进程,则调用execvp(),如果您是父进程,则继续下一个迭代。

1

Execvp用您运行的命令替换当前过程映像。所以它取消了你的C程序。为了产生所需的效果,你应该在execvp之前分叉。它看起来像这样:

int status = 0; 
pid_t pid = fork(); 

if(pid > 0) { 
    waitpid(pid, &status, 0); 
    // is parent 
} else if(pid == 0) { 
    execvp(*args, args); 
    // is child 
} else { 
    // fork didn't work 
} 
+0

但是这对于一个单独的孩子处理。我正在尝试创建无限数量的子进程。将所有这些代码放在无限循环中也无济于事。 –

+2

@AdeelAhmad如果一个while循环不能帮助你执行一个重复的任务,那么我恐怕没有人会。 –

+0

你可以把代码放在一个循环中重复它,只是要小心不要忘记。 – OxenMeat