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

C 管道和重定向,测试理解的小程序,c,C,我已经编写了一个名为“blah”的小程序,它接受stdin字符并将大写字符输出到stdout,如下所示(注意:下面的代码可以根据需要工作): #包括 int main(int argc,字符**argv){ 字符输入[500]; printf(“BLAH已开始正常……”\n); 而(!feof(stdin)){ fprintf(stderr,“startoop\n”); 输入[0]=0; fprintf(stderr,“输入阻塞!\n”); fgets(输入,500,标准输入); fprintf

我已经编写了一个名为“blah”的小程序,它接受stdin字符并将大写字符输出到stdout,如下所示(注意:下面的代码可以根据需要工作):

#包括
int main(int argc,字符**argv){
字符输入[500];
printf(“BLAH已开始正常……”\n);
而(!feof(stdin)){
fprintf(stderr,“startoop\n”);
输入[0]=0;
fprintf(stderr,“输入阻塞!\n”);
fgets(输入,500,标准输入);
fprintf(stderr,“完成输入的阻塞!\n”);
int指数=0;
while(输入[index]!='\n'&输入[index]!=0){
printf(“%c”,输入[索引]-32);
索引++;
}
如果(索引==0){
打破
}
printf(“\n”);
fprintf(stderr,“endloop\n”);
}
printf(“BLAH CLOSED….\n”);
返回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;
}
#包括
int main(int argc,字符**argv){
int-fds1[2];
int-fds2[2];
管道(fds1);
管道(fds2);
int-pid=fork();
如果(pid){
/*母公司*/
关闭(fds1[0]);
关闭(fds2[1]);
char-val[100];
文件*parentwrite=fdopen(fds1[1],“w”);
文件*parentread=fdopen(fds2[0],“r”);
fprintf(parentwrite,“此文本应以大写字母打印\n”);
而(!feof(parentread)){
fgets(val,100,家长阅读);
printf(“从子项打印文本的父项:%s\n”,val);
}
}
其他的
{
/*孩子*/
关闭(fds1[1]);
关闭(fds2[0]);
dup2(fds1[0],0);
dup2(fds2[1],1);
execlp(“./blah”和“./blah”,0);
}
返回0;
}

您不应该在父进程中的
pipe()之后打开
fdopen
ing。只需写/读,
pipe()
返回打开的文件描述符,这就是为什么您可以关闭它们的原因。通常,对循环控制使用
feof()
是一个坏主意,因为只有在尝试读取输入流的末尾之后,才将其设置为“true”

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

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

请注意,打印到stderr的fprint只是为了帮助我尝试理解正在发生的事情-我对CYou是比较新的。您粘贴了一大块代码,并说我的理解有什么问题?。代码应该做什么,它实际上做什么?你的问题还不清楚…我会修改我的帖子,谢谢你的反馈。当你在这里的时候,请正确缩进你的代码。所谓“正确缩进你的代码”是指:在每个大括号“{”(建议4个空格,因为这不会占用页面宽度,即使使用可变宽度字体也可以看到)在每个右大括号“}”之前取消缩进不要使用制表符缩进,因为每个字处理器/编辑器的制表位/制表符宽度设置不同。为了可读性,用空行分隔代码块(如do…while、For()、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