0
我是C編程的新手,我試圖在我的程序中實現重定向功能。C Bash Shell重定向
我一直在研究這段代碼一段時間,真的會欣賞一些新的觀點。
正如我前面所說,我正在努力添加bash所具有的重定向功能(例如:pwd> output.txt),代碼能夠處理大部分基本功能,我已經評論過我如何將它們放在一起。
我的問題(S):
- 將創建一個函數,用戶命令重定向是一些聰明寫?我的代碼很骯髒(我會很感激任何關於清理的提示)
- 我假設我將再次使用strcmp,在一個控件中搜索'<',然後在另一個控件中搜索'>',但我是不確定我應該把搜索放在哪裏(如果我留在主體中,而不創建新的功能)。
我目前正在打磚牆,也許是因爲我一直在這一整天,這裏是我的外殼看起來像現在, 謝謝大家。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
/* C based bash shell, working on creating redirects..*/
int main(int argc, char* argv[]){
char cmnd[1024];
char* str1[100];
const char* str2 = "exit"; //string to compare for exit
char* fullpath= "/bin/";//path set to bin
char progpath[100];//complete file path
const char* home = getenv("HOME"); //get home enviornment
char directory[1024];
char fileD[100];
char* str3[100];
if(argc == 1)
{
while(1){
printf("dollar sign: ");
if(!fgets(cmnd, 1024, stdin))
break;
size_t length = strlen(cmnd);
if (cmnd[length - 1] == '\n')
cmnd[length - 1] = '\0';
if(strcmp(cmnd, str2)==0){ //check if cmnd is exit
break;
}
char *tkn; //split cmnd into separate strings
tkn = strtok(cmnd," ");
int i=0;
while(tkn!=NULL){//until null is reached, break into tkns
str1[i]=tkn;
tkn = strtok(NULL," ");
i++;
}
str1[i]=NULL; //last set to Null (EXECVP req)
strcpy(progpath, fullpath); //copy string /bin/ to file path, for running
if(strcmp(cmnd, "help")==0)//help line
{
printf("Enter bash cmnds, or 'exit' to exit\n");//if help is issued, ignore the rest
} else if(strcmp(cmnd, "today")==0){//today doesn't exist, but "date" does. Replace today with date.
strcat(progpath, "date");
}else{
strcat(progpath, str1[0]);//add program to path
}
for(i=0; i<strlen(progpath); i++){//delete newcmnd
if(progpath[i]=='\n'){
progpath[i]='\0';
}
}//start fork
int pid= fork();
if(pid==0){//if child
if(strcmp(str1[0],"cd") == 0)
{
int tempCmnd;
if(!str1[1])
{
tempCmnd = chdir(getenv("HOME"));//for moving home
if(tempCmnd == -1)
{
fprintf(stderr, "CD err.\n");
}else{
getcwd(directory, sizeof(directory));
printf("Currently in %s\n", directory);
}
}else{
tempCmnd = chdir(str1[1]);
if(tempCmnd == -1)
{
fprintf(stderr, "CD err.\n");
}else{
getcwd(directory, sizeof(directory));
printf("Move Success : %s\n", directory);//pwd
}
}
break;//(end child proc)
}else{
execvp(progpath,str1);
if(strcmp(cmnd, "help")==0)//ignore the error if help is issued, otherwise standard error
{
//printf("Test")
}
else{fprintf(stderr, "Child process could not do execvp\n");}
break;}
}
else{//Parent control
wait(NULL);
}
}
}else{
FILE * pfile;
pfile = fopen(argv[1], "r");
if (pfile == 0)
{
printf("Opening file failed\n");
}else{
fgets(fileD, 100, pfile);//fget file into string
fclose(pfile);//close
char *tkn; //split pCommand by strtok
tkn = strtok(fileD," ");
int i=0;
while(tkn!=NULL){//until null is reached, break into tkns
str1[i]=tkn;
tkn = strtok(NULL," ");
i++;
}
str1[i]=NULL; //end set to null
strcpy(progpath, fullpath); //copy full path to program path
strcat(progpath, str1[0]);//add cmnd to the path
for(i=0; i<strlen(progpath); i++){// iterate to delete newcmnd
if(progpath[i]=='\n'){
progpath[i]='\0';
}
}
execvp(progpath,str1); //execvp with new string
}
}
}
我應該在哪裏放置它?正如你可以看到我已經使用strcmp和strtok我也看到了execvp(也在我的代碼中)。感謝您的回覆,雖然 –
我改進了我的答案。我想如果你google'dup2'或'popen',你會更好地理解它。 –
我給它一個鏡頭,非常感謝你的回覆。 –