커널 파일 디스크립터

wdguitar의 이미지

파일 디스크립터 란게 정확히는 무엇을 의미하는건가요?

https://elixir.bootlin.com/linux/latest/source/include/linux/fdtable.h#L49

이게 프로세스에 있는 파일 번호 (0-stdin, 1-stdout, 2-stderr) 하고는 다른거죠?
정확히 어떻게 다른지 궁금합니다.

아, 또, 이상한게,
line 64-66, 하나짜리 배열을 왜 만들죠?

unsigned long open_fds_init[1];

이거 그냥 unsigned long open_fds_init; 하면 안되나요?

ㅇㅇ의 이미지

https://lkml.org/lkml/2006/1/3/500
여기 링크에 나온 패치를 보시면 embedded_fd_set 스트럭쳐가 기존보다 크기가 작아져서 open_fds_init에 해당 스트럭쳐를 사용했는데 이걸 그냥 풀어서 길이가 1인 배열로 쓰고 있나 봅니다.

ㅇㅇ의 이미지

&연산자를 많이 사용하기 싫었나 봅니다.

익명 사용자의 이미지

아래 익명 사용자님 링크를 따라가 보니, 명확한 설명은 없지만, & 를 쓰기 싫어했다는건 맞는가 봅니다.

익명 사용자의 이미지

이런 패치를 보시고 이해가 되신다니, 정말 부럽습니다. 전 언제 그렇게 될지.

익명 사용자의 이미지

저도 궁금해져서 찾아 봤는데 동일 질문이 있네요..

https://stackoverflow.com/questions/24028874/why-does-such-a-struct-contain-two-array-fields-containing-only-one-element

그런데 명확한 답변은 없나봅니다...

messycomp의 이미지

로그인 하는걸 빼먹어서, 답장이 익명이 되었어요. 다음에는 잘 할께요. :)

일단, 제가 실력이 아직 부족해서 저 패치가 이해는 안됩니다만, size 1 array 는 대충 이해가 됩니다.
위에 언급된것처럼 size[1] 로 정의하면 변수명 자체가 이미 주소값인 경우가 되서, 추가로 & 를 안써도 되는군요.
여기서 바뀐걸 보면 (https://bit.ly/3bsgOLm)

-	struct embedded_fd_set close_on_exec_init;
-	struct embedded_fd_set open_fds_init;
+	unsigned long close_on_exec_init[1];
+	unsigned long open_fds_init[1];

이전 코드에서 사용자가 fdset.close_on_exec_init = some_value; 처럼 사용한다면, 저런식으로 size[1] 배열을 써주지 않을 경우 & 없으면 이유없이 이전 코드가 에러가 나겠네요. 아마 그래서, 같은 이름을 사용하도록 저럴수 밖에 없었던듯 싶네요.

그리고, size 1 배열의 하나더 사용예가, 길이를 runtime 에서 설정할수 있는것 같더군요.
가령, buffer 크기를 config 파일에서 받아온 후에 설정해야 한다면, 난감하겠더군요. 컴파일 할때 크기를 알수 없기 때문이죠.
그래서, 크기를 따로 추후에 설정할수 있도록 하는 경우가 있더군요.

예를 한번 만들어 봤습니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
 
struct somebuffer {
	char key[40];
	char data[1];
};
 
int main(int argc, char **argv)
{
	const int EXTENDED_SIZE = strlen("hello");
	struct somebuffer *loose = alloca( sizeof(struct somebuffer) + EXTENDED_SIZE );
 
	strcpy(loose->key, "Some_key");
	strcpy(loose->data, "Hello" );
 
	printf("%s : %s\n", loose->key, loose->data);
 
	return 0;
}

댓글 달기

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