c - 如何在用 C 编写的 shell 中从命令行执行程序
问题描述
我在 C 编程中创建了一个小 shell,如果命令是启动,它会执行以下启动程序 [额外参数] “程序”是要执行的程序。参数以“/”开头(例如 /usr/bin/xterm,它应该将其解释为完整路径。否则,它的路径从当前目录开始。
它可以有可选的“参数”。它使用 fork() + exec() 以相应的参数启动程序,并等待直到程序终止(使用 waitpid() 调用)。例如
**start /usr/bin/xterm –bg green**
会调出一个绿色背景的终端。在终端关闭之前,提示不会返回。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <signal.h>
#include <sys/wait.h>
// max # args
#define MAX_ARGS 64
// token sparators
#define SEPARATORS " \t\n"
int main (int argc, char ** argv)
{
char buf[1024];
char * args[MAX_ARGS];
char ** arg;
char *** arguments = malloc(3 * sizeof(char**));
__pid_t pid;
int status;
while (1)
{
printf("#");
if (fgets (buf, 1024, stdin ))
{
arg = args;
*arg++ = strtok(buf, SEPARATORS); // tokenize input
while ((*arg++ = strtok(NULL, SEPARATORS)));
if (args[0])
{
//#byebye command, exist the while loop.
if (!strcmp(args[0], "byebye")) {
break;
}
if (!strcmp(args[0], "whereami")) {
// arg string input from user matches whereami
char cwd[1024];
chdir("/path/to/change/directory/to");
getcwd(cwd, sizeof(cwd));
printf("%s\n", cwd);
continue;
}
if (!strcmp(args[0], "start")) {
if (args[1])
{
arguments[0] = malloc(16 * sizeof(char*));
int argument_num = 2;
while (args[argument_num]) {
// grab all the parameters
arguments[0][argument_num - 2] = malloc(strlen(args[argument_num]) * sizeof(char));
strcpy(arguments[0][argument_num - 2], args[argument_num]);
argument_num++;
}
arguments[0][argument_num] = NULL;
if (0 == (pid = fork())) {
// child process
if (-1 == execve(args[1], (char **)arguments[0], NULL)) {
fprintf(stdout, "child process execve failed [%m]\n");
break;
}
}
// wait for child
while (0 == waitpid(pid, &status, WNOHANG)) {}
free(arguments[0]);
}
continue;
}
arg = args;
while (*arg) fprintf(stdout, "%s ", *arg++);
fputs ("\n", stdout);
}
}
}
return 0;
}
出于某种原因,当我测试代码时,它说找不到文件或目录
解决方案
代码工作正常。如果您找不到目录,start /usr/bin/xterm –bg green
则可能是因为/usr/bin/xterm
不存在。你在Mac上?
推荐阅读
- java - 文件名.println(String); 跳过每隔一行
- sockets - sbatch:错误:批处理作业提交失败:运行 Snakemake 时,套接字在发送/接收操作时超时
- r - How to use is.na function with dates
- java - Browser wont identify HTTP response header?
- ruby-on-rails - Heroku Rails 6 multiple connection not working
- python - 文件“C:\Python38-32\lib\os.py”,第 411 行语法错误
- react-native - Expo - AppLoading threw an unexpected error when loading
- php - 如何增加会话数组值?
- c# - 使用 Entity Framework sql 将 Null 插入数据库
- python - Upload multi img to 1 post on Django ? How do that?