我在做一个自制的贝壳(非常简单的贝壳)。我决定使用execvp作为路径,因为对于我的shell来说,路径不是一个可更改的元素。我遇到了一个关于如何同时派生和执行多个进程的逻辑问题。
我的程序应该使用这样的命令:
ls ; echo hello ; cat shell.c
其中每个“;”表示我们希望同时运行这些进程。所以在我们的终端输出端,我们应该让这些命令同时工作。
为了详细说明,我想解释一下我的程序是如何工作的:
A. Intake full command line into char array with a grab line function
B. Split the char array received from the last function by delimiters and place into an array of char arrays (pointer to pointer).
C. If one of the elements in our array of char arrays is ";" we can assume that multi commands are necessary. This is where I have trouble.
我已经确切地知道了需要fork之类的进程的数量,但是我似乎不知道如何同时将所有这些函数及其参数传递给execvp函数。我应该使用临时数组吗?我知道这不应该这么复杂,但不知为什么我搞不清楚。我在下面提交launch函数,它接收一个char数组数组,并根据需要多个命令时设置的“multicommand”变量(通过split line函数)执行相应的操作。
int launch(char **args){
pid_t pid;
int status;
int i = 0;
if(strcmp(args[0], "quit") == 0){
exit(EXIT_SUCCESS);
}
if(strcmp(args[0], ";") != 0){
printf("Essential Command Found : %s\n", args[0]);
numFork++;
}
if(multiCommand == 1){
//Handle Multicommands here
printf("Multi Commands Handling Here\n");
for(; i < elements - 1; i++){
if(strcmp(args[i], ";") == 0){
if((i + 1) < elements){
printf("Essential Command Found : %s\n", args[i + 1]);
numFork++;
}
}
}
//This is where I need to figure out what to do
printf("Fork: %d times\n", numFork);
}else if (multiCommand == 0){
pid = fork();
if(pid == 0){
execvp(args[0], args);
}else{
wait(&status);
}
}
multiCommand = 0;
elements = 0;
return 1;
}
最佳答案
一般的想法是在不同的命令上有一个for循环,并分叉每个命令。
例如。
for(int i = 0; i < commandCount; i++) {
int pid = fork();
if(pid == 0) { //this is the child (don't forget to check for errors and what-not)
execCommand(all, of, the, info, needed);
}
}
您可以使用
strtok()
轻松获得不同的命令。下面是一个例子:
#include <string.h>
#include <stdio.h>
int main() {
char input[] = "abc;def;ghi";
char *token = strtok(input, ";");
while(token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ";");
}
return 0;
}
输出:
abc
def
ghi
最后一个函数如下所示:
char *token = strtok(input, ";");
while(token != NULL) {
int pid = fork();
if(pid == 0) {
//token is one command
//parse the different parts here
execCommand(args, to, exec);
}
token = strtok(NULL, ";");
}
关于c - 同时 fork 和执行多个流程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39603612/