【发布时间】:2013-12-06 11:49:45
【问题描述】:
到目前为止,我编写了这个简单的 shell。但是我的外壳遇到了一些麻烦。 例如,当我尝试通过命令“evince pdffile.pdf”打开一个 pdf 文件时,实际的 pdfile 并没有被打开。 pdf 查看器运行,但包含全部内容的实际文件永远不会出现。 或者另一个例子是命令“ls -l”。我没有得到应有的文件和文件夹,但“ls”正在工作。 另一个例子是gedit,等等。 另外,我应该提一下。我没有使用“system()”,因为 system() 会做所有事情,而我无事可做。相反,我使用的是“execvp()”。 这是代码。我希望你能找到问题所在,因为我不知道问题是什么原因造成的。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h>
#define MAX_LENGTH 1024
#define DELIMS " \t\r\n"
void exec_cmd (char *buf);
int main() {
char line[MAX_LENGTH];
char * cmd;
char curDir[100];
while (1) {
getcwd(curDir, 100);
printf("%s@%s$ ", getlogin(), curDir);
if (!fgets(line, MAX_LENGTH, stdin))
break;
if ((cmd = strtok(line, DELIMS))) {
errno = 0;
if (strcmp(cmd, "cd") == 0) {
char *arg = strtok(0, DELIMS);
if (!arg)
fprintf(stderr, "cd: argument is missing.\n");
else chdir(arg);
} else if (strcmp(cmd, "exit") == 0) {
exit(0);
} else exec_cmd(line);
if (errno) perror("Error. Command failure");
}
}
return 0;
}
void exec_cmd (char *buf) {
int status = 0;
char *argv[MAX_LENGTH];
int j=0;
pid_t pid;
argv[j++] = strtok (buf, DELIMS);
while (j<MAX_LENGTH && (argv[j++]=strtok(NULL,DELIMS))!=NULL); // EDIT: " " replaced by DELIMS
pid = fork();
if(pid < 0) {
printf("Error occured");
exit(-1);
} else if(pid == 0) {
execvp(argv[0],argv);
} else if( pid > 0) {
wait(&status);
}
}
【问题讨论】:
标签: c linux bash shell command-line-arguments