execvp实现shell版本,arg[1] :ls arg[2]: -l arg[3] \n
时间: 2023-09-23 09:11:09 浏览: 58
好的,这次我会以更加实用的方式实现一个 shell 版本,并且让它能够运行 `ls -l` 命令。以下是代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#define MAX_ARGS 10
#define MAX_ARG_LEN 50
int main() {
char* args[MAX_ARGS + 1];
char arg[MAX_ARG_LEN + 1];
int argc;
while (1) {
// 打印提示符并读取用户输入的命令行参数
printf("> ");
if (fgets(arg, MAX_ARG_LEN, stdin) == NULL) {
break;
}
// 解析命令行参数
argc = 0;
char* token = strtok(arg, " \t\n");
while (token != NULL) {
if (argc >= MAX_ARGS) {
printf("Too many arguments\n");
break;
}
args[argc++] = token;
token = strtok(NULL, " \t\n");
}
if (argc == 0) {
continue;
}
args[argc] = NULL;
// 创建子进程执行命令
pid_t pid = fork();
if (pid == -1) {
perror("fork");
continue;
} else if (pid == 0) {
execvp(args[0], args);
perror(args[0]);
exit(EXIT_FAILURE);
}
// 等待子进程结束
int status;
waitpid(pid, &status, 0);
if (WIFEXITED(status)) {
int exit_status = WEXITSTATUS(status);
if (exit_status != 0) {
printf("Command exited with status %d\n", exit_status);
}
} else if (WIFSIGNALED(status)) {
int signal_number = WTERMSIG(status);
printf("Command terminated by signal %d\n", signal_number);
}
}
return 0;
}
```
这个程序会不断地循环读取用户输入的命令行参数,并在每次循环中执行以下步骤:
1. 解析命令行参数,将它们存储在 `args` 数组中。
2. 创建子进程执行命令。
3. 等待子进程结束,并检查命令是否成功执行。
注意,这个程序使用 `fork` 函数来创建子进程,并在子进程中调用 `execvp` 函数执行命令。在父进程中,我们使用 `waitpid` 函数等待子进程结束,并检查命令执行的结果。
现在,如果你运行这个程序并输入 `ls -l`,它会在终端上显示目录列表。你可以尝试运行其他命令,例如 `pwd` 或者 `echo hello`。
阅读全文