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 』
댓글 달기