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하고자 하는데요.

익명 사용자의 이미지

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를 출력하게 됩니다.

익명 사용자의 이미지

^.^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.