fork 관련하여 질문입니다.
아래는 부모자식간에 파일포인터를 공유해서 한파일에 동시에
write 가 가능한지 테스트해보았는데 잘안되는것같아요.
open 시스템호출로 fd를 얻은후 자식과 부모에서 write하는것은
포맷된 출력(formatted print ex)%s %d ...)이 불가능해서 선택에서 제외
했거든요.
지금 해야하는것은
부모 자식간에 동일 파일에 사이좋게 write하는것입니다.
이것이 가능할까요?
혹은 부모에서 open으로 얻은 fd를 이용해서 자식에서 fprintf같은
형식화출력이 가능한게 있나요?
#include
#include
FILE *fp;
int main()
{
pid_t pid;
fp = fopen( "file" , "w" );
fprintf( fp , "%s" , "This starts\n" );
pid = fork();
switch ( pid )
{
case -1 perror( "fork fail" );
break;
case 0
fprintf( fp , "%s" , "I'm Child\n" );
break;
default
wait( 0 );
fprintf( fp , "%s" , "I'm Parent\n" );
fclose( fp );
}
return 0;
}
위의 코드는 원하는 결과를 얻을수 있는지 테스트해보기위해
간단히 만든거구요.
실제로는 a라는 파일에
parent abc
child def
parent ghi
child xyz
...
이런식으로 write하고자 하는데요.
Re: fork 관련하여 질문입니다.
seeker wrote..
아래는 부모자식간에 파일포인터를 공유해서 한파일에 동시에
write 가 가능한지 테스트해보았는데 잘안되는것같아요.
open 시스템호출로 fd를 얻은후 자식과 부모에서 write하는것은
포맷된 출력(formatted print ex)%s %d ...)이 불가능해서 선택에서 제 외
했거든요.
지금 해야하는것은
부모 자식간에 동일 파일에 사이좋게 write하는것입니다.
이것이 가능할까요?
혹은 부모에서 open으로 얻은 fd를 이용해서 자식에서 fprintf같은
형식화출력이 가능한게 있나요?
#include <stdio.h>
#include <sys/types.h>
FILE *fp;
int main()
{
pid_t pid;
fp = fopen( "file" , "w" );
fprintf( fp , "%s" , "This starts\n" );
pid = fork();
switch ( pid )
{
case -1 perror( "fork fail" );
break;
case 0
fprintf( fp , "%s" , "I'm Child\n" );
break;
default
wait( 0 );
fprintf( fp , "%s" , "I'm Parent\n" );
fclose( fp );
}
return 0;
}
위의 코드는 원하는 결과를 얻을수 있는지 테스트해보기위해
간단히 만든거구요.
실제로는 a라는 파일에
parent abc
child def
parent ghi
child xyz
...
이런식으로 write하고자 하는데요.
저 위 프로그램을 실행시켜보니
file이란 파일이 만들어지고 내용은
This starts
I'm Child
This starts
I'm Parent
이렇더군요..
This starts가 2번 찍혀서 잘 안된다고 하시는 것 같은데
위의 소스에서
fp = fopen( "file" , "w" );
fprintf( fp , "%s" , "This starts\n" );
fprintf다음에 fflush(fp);를 추가해 주시면 잘 될겁니다.
This starts가 2번 찍히는 이유는
fprintf는 library함수인데, kernel영역의 버퍼와는 다른
사용자 영역에 버퍼를 할당해 놓고 버퍼가 꽉 찼을때
실제 systemcall을 호출하여 파일에 쓰게 됩니다.
근데 This starts 문자열 길이가 버퍼크기보다 작나봅니다
(버퍼크기가 어느정돈지는 저두 모르겠습니다)
그래서 아직 파일에 기록은 안해놓은 상태에서
버퍼에다만 This starts를 써 놨겠죠.
그 담에 fork()로 자식 프로세스가 만들어지고
그 자식이 I'm child를 또 출력하는데, 이제 버퍼의 크기를 넘어서게
되어 This starts와 I'm child를 시스템콜을 통해 실제로 파일에
기록하게 되고 이 자식 프로세스는 종료하게 되죠.
그리고 나서 부모또한 I'm parent를 출력하는데, 역시 부모의
버퍼에도 This starts가 이미 있고, I'm parent라는 문자열에 의해
버퍼크기를 넘어서게 되므로
버퍼에 남아있는 This starts와 I'm parent를 출력하게 됩니다.
Re^2: 감사합니다.(냉무)
^.^
댓글 달기