fork 시 file에 오픈여부

BarracuTa의 이미지

자식 프로세스가 fork로 상속받은 화일 기술자를 닫아 버렸을때
부모 프로세스에서는 어떤 상황이 발생하는지에 대한 테스트입니다.
부모프로세스에서 화일이 개방된 상태로 남아 있을까하는 부분인데
아래결과에서 모드가 O_RDWR로 나온것도 이상하고
생성된 화일에 퍼미션에 S도 아리송합니다.
제생각에는 결과에는 스위치문에 no such mode 가출력되고
close도 이미 닫힌 기술자이기때문에 오류발생이 나야한다고 생각이들거든요...

왜 그런건가요?

질문 읽어주셔서 감사합니다.

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/wait.h>

int main()
{
        pid_t pid;
        int fd;
        int arg;
        if((fd=open("test2",O_CREAT|O_RDWR))==-1)
        {
                perror("open");
                exit(1);
        }

        if((pid=fork())<0)
        {
                perror("fork");
                exit(1);
        }
        else if(pid==0)//자식
        {

                printf("child close fd%d\n",fd);
                close(fd);//파일을 닫는다.
                sleep(5);
        }
        else
        {
                wait((int*)0);
                printf("im parent %d\n",fd);
                arg=fcntl(fd,F_GETFL);
            switch(arg&O_ACCMODE)
                {
                        case O_RDWR:printf("rdwr\n");break;
                        case O_WRONLY:print("wronly\n");break;
                        case O_RDONLY:printf("rdonly\n");break;
                        default:printf("no such mode\n");

                }

                if(close(fd)==-1)
                {
                        perror("close");
                        exit(1);
                }
        }
        exit(0);
}

결과창

child close fd3
im parent 3
rdw

생성된 파일에 퍼미션입니다...
---Srwx--- 1 barracuTa barracuTa 0 7월 13 01:28test2

rm 하고 제 실행하니 퍼미션이 이번엔 아래와 같습니다.
--w--ws---  1 barracuTa barracuTa    0  7월 13 02:35 test2
ssehoony의 이미지

퍼미션 문제는 open 함수에 파일 퍼미션 값을 넘겨주지 않아서 쓰래기 값으로 퍼미션이 셋팅되서 그런듯 하네요.

그리고 fork 하면 자식에서 닫아도 부모는 열려있는게 맞습니다.
반대로 부모가 닫아도 자식은 열려있습니다.

하지만 소켓의 경우는 2가지가 있습니다.
그냥 close 함수를 통해 닫을 때는 위에 말한 것 처럼 작동하지만
shutdown 으로 닫게 되면 부모와 자식 모두 닫히게 됩니다.
(내부적으로 좀 더 복잡한 이유가 있지만 결과적으로 이렇게 됩니다.)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.