Я пишу свою собственную оболочку и, похоже, у меня возникла какая-то проблема с тем, что strcat () неожиданно перезаписывает строку.
Проблема заключается в попытке выполнить файл в локальном каталоге.Второе значение в пути, которое он должен искать, это «.»и первым является / bin, но при добавлении команды в / bin для абсолютного пути, чтобы дать execlp()
, период также перезаписывается командой.Я знаю, что MYPATH
странно и странно разделять на #s, но это не имеет отношения к проблеме.
Я вставил несколько полезных printf()
операторов, если вы хотите запустить его, чтобы увидетьо чем я говорю.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <sys/stat.h>
void execute(char**, int, char**, int);
int main (){
char *command, *mypath, *buffer, *arglist[1024], *pathlist[1024], **ap;
buffer = malloc(1024);
int loop = 1;
while (loop == 1){
int argnum = 0, pathnum = 0;
mypath = malloc(1024);
if(getenv("MYPATH") == NULL)
strcpy(mypath, "/bin#.");
else
strcpy(mypath, getenv("MYPATH"));
printf("myshell$ ");
command = readline("");
if(strcmp(command, "exit") == 0 || strcmp(command, "quit") == 0)
return 0;
if(strcmp(command, "") == 0)
continue;
/*Tokenizes Command*/
for(ap = arglist; (*ap = strsep(&command, " \t")) != NULL;){
argnum++;
if(**ap != '\0')
if(++ap >= &arglist[1024])
break;
}
/*Tokenizes Path*/
for(ap = pathlist; (*ap = strsep(&mypath, "#")) != NULL;){
pathnum++;
if(**ap != '\0')
if(++ap >= &pathlist[1024])
break;
}
execute(pathlist, pathnum, arglist, argnum);
}
return 0;
}
void execute(char *pathlist[], int pathnum, char *arglist[], int argnum){
pid_t pid;
int i;
int found = 0;
struct stat buf;
for(i = 0; i < pathnum; i++){
if (found == 1)
break;
printf("pathlist[0]: %s\n", pathlist[0]);
printf("pathlist[1]: %s\n", pathlist[1]);
strcat(pathlist[i], "/");
strcat(pathlist[i], arglist[0]);
printf("Pathlist[0] after strcat: %s\n", pathlist[0]);
printf("Pathlist[1] after strcat: %s\n", pathlist[1]);
if(stat(pathlist[i], &buf) == 0){
found = 1;
pid = fork();
if(pid == -1)
printf("Error: Fork Failed\n");
else if(pid == 0){
if(argnum == 0)
execlp(pathlist[i], arglist[0], (char *) NULL);
else if(argnum == 1)
execlp(pathlist[i], arglist[0], arglist[1], (char *) NULL);
else if(argnum == 2)
execlp(pathlist[i], arglist[0], arglist[1], arglist[2], (char *) NULL);
else if(argnum == 3)
execlp(pathlist[i], arglist[0], arglist[1], arglist[2], (char *) NULL);
}
else if(strcmp(arglist[argnum-1], "&") != 0){
wait(NULL);
}
}
else if(stat(pathlist[i], &buf) == -1 && i == pathnum-1 && found == 0)
printf("Error: Command '%s' not found.\n", arglist[0]);
}
}