同时 fork 和 exec 多个进程
Fork and exec multiple processes simultaneously
我正在制作一个自制的 shell(非常简单 shell)。我决定采用使用 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 函数。我应该使用临时数组吗?我知道这不应该这么复杂,但出于某种原因我无法弄清楚。我在下面提交我的启动函数,它接收一个 char 数组数组并根据我的 "multiCommand" 变量相应地执行,该变量是在需要多命令时设置的(通过我的分割线函数)
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, ";");
}
我正在制作一个自制的 shell(非常简单 shell)。我决定采用使用 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 函数。我应该使用临时数组吗?我知道这不应该这么复杂,但出于某种原因我无法弄清楚。我在下面提交我的启动函数,它接收一个 char 数组数组并根据我的 "multiCommand" 变量相应地执行,该变量是在需要多命令时设置的(通过我的分割线函数)
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, ";");
}