多进程shell:接收命令行上的输入,创建新进程并加载执行用户 输入,输入可以为:绝对路径,命令+选项等。 • fork+(exec类函数,如execve ,execv)execve+waitpid • 字符串处理类函数写出c语言代码
时间: 2023-06-24 19:05:13 浏览: 106
linux系统进程间通信共享内存方式实现及简单命令解释器实现.zip
以下是一个简单的多进程shell示例,可以接收用户输入并执行命令:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_ARGS 10
#define MAX_CMD_LEN 100
int main() {
char cmd[MAX_CMD_LEN];
char* args[MAX_ARGS];
int status;
pid_t pid;
while (1) {
printf("> ");
if (!fgets(cmd, MAX_CMD_LEN, stdin)) {
break;
}
// 删除换行符
cmd[strcspn(cmd, "\n")] = '\0';
// 解析命令参数
char* arg = strtok(cmd, " ");
int i = 0;
while (arg && i < MAX_ARGS - 1) {
args[i++] = arg;
arg = strtok(NULL, " ");
}
args[i] = NULL;
// 创建子进程并执行命令
pid = fork();
if (pid < 0) {
perror("fork");
exit(EXIT_FAILURE);
} else if (pid == 0) {
if (execvp(args[0], args) < 0) {
perror("execvp");
exit(EXIT_FAILURE);
}
} else {
// 等待子进程结束
waitpid(pid, &status, 0);
}
}
return 0;
}
```
在上面的代码中,我们首先使用`fgets`函数从标准输入中读取用户输入的命令。然后,我们使用`strtok`函数将命令行分解为参数,并将它们保存在`args`数组中。接下来,我们使用`fork`函数创建一个子进程,并在子进程中使用`execvp`函数执行命令。父进程使用`waitpid`函数等待子进程结束。这个过程会一直重复,直到用户通过键盘输入`Ctrl+C`或者`Ctrl+D`退出程序。
阅读全文