我寫了這個簡單的殼到目前爲止。但是我的外殼遇到了一些麻煩。 例如,當我嘗試通過命令「evince pdffile.pdf」打開pdf文件時,實際的pdfile不會打開。 PDF查看器運行,但整個內容的實際文件從不出現。 或者另一個例子是命令「ls -l」。我沒有列出應該列出的文件和文件夾,但「ls」正在工作。 另一個例子是gedit,等等。 另外,我應該提到。我不使用「system()」,因爲system()會做所有事情,我不會有事情要做。相反,我使用「execvp()」。 這是代碼。我希望你可能會發現問題,因爲我不知道問題是由什麼引起的。C - 在linux上的一個簡單的shell - 命令的一些麻煩
#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("%[email protected]%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);
}
}
是的,你是對的。我錯過了最後一個strtok。我糾正了這個錯誤,但問題依然存在。 – tumbler
@ user2965601:並且,當您打印出參數時,您看到了什麼?修復之前和之後。這是答案的關鍵,也是調試實際問題的最佳解決方案。 – paxdiablo
我用while循環在另一個數組中複製了行[]的內容。 它似乎在工作。我還應該使用strdup嗎? – tumbler