如何解决如何在用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?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。