不完全将输出重定向到文件

时间:2017-04-15 08:26:14

标签: c linux shell redirect

您好,感谢您的关注。我正在编写自己的shell,并且将输出重定向到文件时遇到小问题。例如,用户写道:ls -l>>输出。如果我找到“>>”,我应该重定向命令的第一部分,我的意思是调用效果ls -l到文件“output”。我尝试在案例1中执行此操作,但是文件被重定向到一个通道并且程序停止,没有出现“Shell - >”并且没有任何进行。你能提出一些建议来解决这个问题吗?感谢。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <ctype.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>

int *parse(char *linia, char **argv)
{
    int counter = -1;
    while (*linia != '\0') 
    {       
        while (*linia == ' ' || *linia == '\t' || *linia == '\n')
            *linia++ = '\0';  
        *argv++ = linia; 
        counter++;   
        while (*linia != '\0' && *linia != ' ' &&  *linia != '\t' && *linia != '\n') 
            linia++;            
    }
    *argv = '\0'; 
    return counter;
}

void execute(char **argv)
{
    pid_t pid;
    int status;

    if ((pid = fork()) < 0) 
    {     
        printf("*** ERROR ***\n");
        exit(1);
    }
    else if (pid == 0) 
    {          
        if (execvp(*argv, argv) < 0) 
        {    
            printf("*** ERROR ***\n");
            exit(1);
        }
    }
    else 
    {                                  
        while (wait(&status) != pid);
    }
}                


int specialChar(char *argv)
{
    int i=0;
    while(argv[i]!='\0')
    {
        if(argv[i]=='>' && argv[i+1]=='>')
            return 1;           
        else if(argv[i]=='&')
            return 2;           
        else if(argv[i]=='|')
            return 3;           
        i++;
    }
}

void  main()
{
    char command[20];
    char *argv[64];
    char **history = (char**)malloc(20*sizeof(char*));
    int counter1=-1;
    int counter2=0;
    for(counter2 = 0; counter2<20; counter2++)
    {
        history[counter2]=(char*)malloc(100*sizeof(char));
    }
    int start = 0;
    FILE *file;
    file=fopen("his", "w");
    if(!file)
        printf("ERROR"); 
    int i=0;
    while (1) 
    {       
        printf("Shell -> ");     
        gets(command);
        counter1++;
        strcpy(history[counter1],command);
        fopen("his", "w");
        if(counter1<20)
            for(i=0; i<=counter1; i++)
            {
                fprintf(file,"%s\n",history[i]);
            }    
        else
            for(i=counter1-20; i<counter1; i++)
            {
                fprintf(file,"%s\n",history[i]);
            }
        fflush(file);
        printf("\n"); 
        switch(specialChar(command))
        {       
            case 1:
            i = parse(command, argv);
            int file1 = open(argv[i], O_APPEND | O_WRONLY);
            dup2(file1,1)   ;  
            if (strcmp(argv[0], "exit") == 0) 
                  exit(0);       
            execute(argv); 
            close(file1);
            break;
            case 2:

            break;
            case 3:

            break;
            default:
            parse(command, argv);      
            if (strcmp(argv[0], "exit") == 0) 
                  exit(0);       
            execute(argv);  
            break;     
        }
        fclose(file);
        }
}

0 个答案:

没有答案