thread별로 유지되는 errno 구현방법이 알고 싶습니다.

xjiwoox의 이미지

일반적으로 전역변수 errno를 참조할 때 _REENTRANT가 define되어있지 않으면 process 내의 모든 thread가 같은 errno 변수를, _REENTRANT가 define되어 있으면 각 thread가 서로 다른 errno를 참조하게 되는데요.
시스템 함수에서 에러 발생시 어떻게 thread별로 errno를 셋팅하는지, 또 각 thread는 어떻게 자신의 errno를 구분해서 참조하는지 알고 싶습니다.

Dr_stein의 이미지

Key를 사용하면, thread 별로 static한 변수를 사용할 수 있습니다만
error number를 그렇게 셋팅해서 쓰는지는 잘 모르겠습니다.

앞마당 먹고 시작한 저그의 8할은 뮤탈 테크를 먼저 탄다. 하지만 나머지 2할때문에 항상 스켄이 모자란다. - _-;

xjiwoox의 이미지

Key를 사용한다는게 무슨 뜻인지 잘 모르겠습니다 ^^
좀 더 구체적으로 설명해 주시면 안 될까요.
부탁드립니다.

s(˘∼˘*)z,·´″"`°³о$ √(´∀`√)... (˘ヘ˘ㆀ)a

shkwon81의 이미지

쓰레드 특정 데이터 (Thread specific data) 메커니즘을 사용하여 쓰레드 별 errno 를 구현할 수 있다는 의도로 보입니다.

물론 충분히 가능한 방법이라고 생각합니다만, 그것까지는 모르겠고 차이점만을 말씀드리자면,

_REENTRANT 가 없으면 errno는

extern in errno;

즉, 전역 변수를 공유해 사용합니다. 이에 비해 _REENTRANT가 정의되어 있으면

define errno (*__errno_location ())

와 같이 errno 를 __errno_location() 함수 호출로 치환합니다.
__errno_location() 함수는 적절한 방법을 써서 각 쓰레드별로 각각 다른
errno 값을 가지고 있겠지요.. 이 방법 중에 하나가 쓰레드 특정 데이터가
될 수 있을 것입니다.

한 가지 주의를 덧붙이자면, 쓰레드 프로그래밍을 하실 때는

int errno;

와 같이 이전에 하시던 대로 errno 변수를 정의하시면 안 됩니다.
위에서 errno는 전처리기에 의해 치환되어 버리겠지요 ^^

전웅의 이미지

shkwon81 님께서 아주 잘 설명해 주셨습니다.

첨언하자면, errno 는 여러가지 현실적인 문제 (예를 들면, 현재 논의 중인
shared library 와 관련된 문제나 floating-point arithmetic 에서 pipelining
을 망치는 문제 등) 로 인해 errno 자체가 반드시 object 로 선언될 필요는
없습니다. 다만, 수정가능한 lvalue 이기만 하면 됩니다. 따라서, 위에서
보여주신 매크로를 사용한 예가 충분히 가능합니다.

또한, 표준은 implementer 에게 예약되는 명칭에 errno 를 다양한 문맥에서
포함해 줌으로써 사용자의 프로그램 내에서 임의로 선언하거나 (실제 존재할지
안 할지 알 수 없는) errno 라는 대상체에 어떻게든 접근하려는 행동을 철저히
금지하고 있습니다.

errno 외에도 C 언어의 표준 라이브러리에는 <time.h>, <locale.h> 등과 관련된
static object, <ctype.h> 과 관련된 shared table, rand() 와 관련된 random
seed 등이 재진입성을 고려해 작성되어야 하는 함수 들입니다.

그럼...

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

댓글 달기

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