我写了一个名为“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;
}
答案 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