IPC로 버퍼의 문자열을 교환하려고 하던 중에 문제가 발생합니다.
글쓴이: dltkddyd / 작성시간: 월, 2013/02/25 - 4:18오후
#include <unistd.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
int main() {
int fdforpipe[2];
char buffer[]={"This is parent."};
printf("dd %s\n",buffer);
int writinglength=0;
int readinglength=0;
if(pipe(fdforpipe)==-1) {
printf("The error message : pipe call error\n");
exit(0);
}
pid_t pid=0;
switch(pid=fork()) {
case -1:
printf("The error message : fork call error\n");
exit(0);
break;
case 0:
close(fdforpipe[1]);
while((readinglength=read(fdforpipe[0],buffer,256))!=0 || readinglength!=-1) {
printf("%s",buffer);
}
break;
default:
printf("in parent\n");//test
printf("%d\n",strlen(buffer));//test
printf("%s",buffer);//여기서 출력이 안됩니다.
//cout<<buffer<<endl;//cout으로는 출력이 됩니다.
close(fdforpipe[0]);
writinglength=write(fdforpipe[1],buffer,strlen(buffer));
break;
}
while(1) { }
return 0;
}위와 같이 소스코드를 만들었습니다. 문제는 부모와 자식프로세스가 분기되는 지점의 switch 블록 안의 부모프로세스에서 buffer가 가리키는 내용이 printf로 출력되지 않습니다. 그러나 cout으로는 출력이 되는데요, 왜 이런 문제가 발생하는 건가요? printf에 무슨 문제가 있는 건가요?
Forums:


음 ..
printf 쪽의 출력은 buffering 된 것 같네요.
printf 에도 \n 을 붙여 주시거나.. printf 이후에 fflush(stdout) 넣어주시거나.. 해보시죠.
참고 -
http://www.gnu.org/software/libc/manual/html_node/Controlling-Buffering.html
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
그렇게 하니 되는데요. 그런데 문제는..
그 이유가 잘 이해되지 않습니다. bufferring은 표준입력시에 발생하는 게 아닌가요? 한 문자의 입력을 받아오는 함수를 사용했는데, 여러개의 문자가 입력된 경우말입니다. 이런 건 표준입력스트림과 관련있는 것으로 아는데요. 표준출력에도 bufferring이 있다는 것은 잘 모르겠습니다. 왜 \n을 붙이면, 언급했던 문제가 해결되는 것인가요?
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
음 ..
buffered i/o 로 검색해 보세요.
stream buffer 를 이용하는 i/o 함수들은 direct 로 출력되지 않고, buffer 에 저장되었다가..
\n 과 같은 flush 조건을 만나거나, 강제로 flush 시켰을 때에 출력됩니다.
그래서 위에 setvbuf 와 관련된 링크를 첨부한 것이구요.
그 상위 문서인 Stream Buffering 과 I/O on streams 도 살펴 보시면 이해하시는 데 도움이 될겁니다.
http://www.gnu.org/software/libc/manual/html_node/Stream-Buffering.html
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
댓글 달기