简体   繁体   中英

Redirecting input and output in a shell

Hi I've been programming a shell in c and I got stuck while trying to redirect. While redirecting the stdout in my program works the stdin doesn't.

void redirect(node_t* node){
    // mode 0: >$%d mode 1: < mode 2: > mode 3: >>
    int input = 0;
    if(node->redirect.mode == 2){
        input = 1; // >
    } else{
        input = 0; // <
    }
    int pid = 0;
    int *status = 0;
    char * filename = node->redirect.target; // filename
    int fd;
    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC);
    if((pid = fork()) == 0){
        dup2(fd, input); // STDIN OR STDOUT
        close(fd);
        node_t* node2 = node->redirect.child;
        execvp(node2->command.program, node2->command.argv); // execute program
        printf("failed to execvp\n");
        exit(1);        
    } else {
        wait(status);
    }
}

I'm new to the fork() but my question is what am I doing wrong here that redirecting stdout works but stdin it writes nothing to the given file.

As mentioned in the comments, you need to use different open options depending on whether you're opening the file for input or output redirection. You can put this into your if .

int flags;
if(node->redirect.mode == 2){
    input = 1; // >
    flags = O_WRONLY | O_CREAT | O_TRUNC;
} else{
    input = 0; // <
    flags = O_RDONLY;
}
int pid = 0;
int *status = 0;
char * filename = node->redirect.target; // filename
int fd;
fd = open(filename, flags, 0666);

Also, you need to specify the permission modes for the case where the output file is created. It's OK to specify this argument all the time, it will be ignored when O_CREAT isn't in the flags.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM