管道和重定向,小程序来测试理解

时间:2015-09-28 18:01:42

标签: c

我写了一个名为“blah”的小程序,它接受stdin字符并将大写字符输出到stdout,见下文(注意:紧接下面的代码按照需要工作):

#include <stdio.h>
int main(int argc, char** argv) {

char input[500];
printf( "BLAH HAS STARTED OK......\n");
while (!feof(stdin)){
    fprintf(stderr, "startloop\n");
    input[0]=0;
    fprintf(stderr, "blocking for input !\n");
    fgets(input, 500, stdin);
    fprintf(stderr, "finished blocking for input !\n");
    int index=0;
    while (input[index]!='\n' && input[index]!=0 ){
        printf("%c", input[index]-32);
        index++;
    }
    if (index==0){
        break;
    }
    printf("\n");
    fprintf(stderr, "endloop\n");
}
printf("BLAH CLOSED.....\n");
return 0;
}

另一个程序,它为父母与子女之间的沟通制作管道,还有一个供孩子与父母沟通的管道。然后该进程分叉子进程,子进程的stdin重定向到父写入管道的输出端,子进程的stdout重定向到父读取管道的输入端。由于blah按预期运行,我预计写入父写管道的测试将以大写字母返回。有人可以解释我的理解有什么问题吗?

#include <stdio.h>
int main(int argc, char** argv) {

    int fds1[2];
    int fds2[2];
    pipe(fds1);
    pipe(fds2);
    int pid=fork();
    if (pid) {
    /* parent*/
    close(fds1[0]);
    close(fds2[1]);
    char val[100];
    FILE* parentwrite=fdopen(fds1[1], "w");
    FILE* parentread=fdopen(fds2[0], "r");
    fprintf(parentwrite, "this text should be printed in capitals\n");
    while (!feof(parentread)){
        fgets(val, 100, parentread);
        printf("PARENT PRINTING TEXT FROM CHILD: %s\n", val);
    }
    }
    else 
    {
    /*child*/
    close(fds1[1]);
    close(fds2[0]);
    dup2(fds1[0],0);
    dup2(fds2[1],1);
    execlp("./blah", "./blah", 0);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

您的父进程中fdopen之后不应该pipe()。只需写/读,pipe()返回打开的文件描述符,这就是你可以关闭它们的原因

答案 1 :(得分:0)

一般来说,使用feof()进行循环控制是一个坏主意,因为只有在尝试读取输入流结束后才设置为'true'。

建议在fgets()语句中使用while()语句进行循环控制。类似于:

fprintf(stderr, "startloop\n");
while ( fgets(input, sizeof( input ), stdin) )
{
    fprintf(stderr, "finished blocking for input !\n");

    for( index 0; input[index]!='\n' && input[index]!='\0'; index++ )
    {
        printf("%c", input[index]-32);
        //printf("%c", input[index]-32); // ??? 32 is a space, relatively meaningless in this scenario
    } // end for

    printf("\n");
    fprintf(stderr, "endloop\n");
} // end while