open : file descriptor 가 0으로 열리는 경우?

antz의 이미지

pynoos님의 지적으로 수정합니다.

파일포인터 -> file descriptor

답변 감사드립니다. :D

Quote:
안녕하세요.

file = open("test.txt", RDONLY);

문1> 이런식으로 했을 때 file이 0인경우가 정상인가요???

if ((file=open("test.txt", RDONLY)) > 0)
{
파일이 정상적으로 열리면...
}

저는 0이 에러라는 생각에 있었는데...

프로그램을 짜다 보니 file descriptor가 0값이 나오네요.

문2> 혹시 file descriptor로 0이 안나오게 한다던지 하는 건 없나요?

프로그램을 짜놓았는데...

당황되네요.

답변 부탁드리겠습니다.

pynoos의 이미지

file pointer 가 아니라 file descriptor 이며,

이것은 0 부터 시작하는 값입니다.

대개 0, 1, 2 는 stdin, stdout, stderr 로 사용됩니다.

그러나, close(0) 한뒤 open 하는 첫 descriptor는 0 을 갖게 되죠.

isinji의 이미지

대부분의 시스템 콜은 정상적일 경우 0을 리턴합니다. 보통 0이 아닌 경우(특히 -1)가 에러이죠...
물론 0이 아닌 양수가 정상적인 return 값인 경우도 있습니다.(bytes나 count에 관련된 것들...)

Quote:
RETURN VALUES

On successful completion, the open() and creat() functions return the file
descriptor, which is a nonnegative integer. If the open fails, a value of
-1 is returned and errno is set to indicate the error.

cjy1126의 이미지

file = open("test.txt", RDONLY);

문1> 이런식으로 했을 때 file이 0인경우가 정상인가요???

if ((file=open("test.txt", RDONLY)) > 0) 
{ 
파일이 정상적으로 열리면... 
} 

위에서는 0일때는 참이 아닙니다.
if ((file=open("test.txt", RDONLY)) >= 0) 이되여야 0도 포함되죠.

저는 0이 에러라는 생각에 있었는데... 대부분의 시스템콜은 -1이 에러입니다. 음수값이 아니면 성공적이 return을 가르키죠.

프로그램을 짜다 보니 file descriptor가 0값이 나오네요. open으로 fd를 return해줄때는 현재 사용하지않는 fd중 가장작은 값을 줍니다. 보통 0(표준입력), 1(표준출력), 2(표준에러)를 사용하기때문에 3이 return되죠. 즉 0이 return되려면 0(표준입력)을 close(0)하고 open하면되는거죠.

문2> 혹시 file descriptor로 0이 안나오게 한다던지 하는 건 없나요?

default는 0이 안나옵니다.
위에 말한대로 0, 1, 2은 default로 셋팅이되서 나옵니다.

phhot의 이미지

일반적으로 0이외의 리턴값은 에러를 나타냅니다.
에러 종류가 여러가지가 될수 있기 때문에 그렇답니다.
위에서는 filedescripter이기 때문에 stdin을 나타내는 겁니다.

^^

댓글 달기

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