我是C语言编程的新手,我正在尝试在我的程序中实现重定向功能。
我已经研究了这段代码一段时间了,我非常希望看到一些新的观点。
如前所述,我正在努力添加bash所具有的重定向特性(例如: pwd > output.txt),代码能够处理大多数基本功能,我已经评论了我是如何将它组合在一起的。
我的问题:
我现在碰到了一块砖墙,也许是因为我一整天都在做这件事,下面是我的外壳,谢谢大家。
#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
}
}
}发布于 2016-09-25 05:29:20
是的,将其组合在一起的一种方法是使用strcmp()查找字符<。您可以通过使用strtok()或strchr()拆分字符串来获得文件名。然后将文件的内容作为参数传递给命令。
要重定向产出:
打开文件描述符,并使用dup2(fd, 1)写入打开文件描述符。
或者,使用popen()执行命令,并将输出写入文件。
https://stackoverflow.com/questions/39683621
复制相似问题