fifo에 버퍼에 관한 질문입니다.

alsong의 이미지

기본 buff가 8k로 잡혀 있더군요.
근데 buff사이즈 조절을 어떻게 하는지
자료 찾기가 힘드네요.

관련 사이트를 알고 계시면... 알려주세요 :)

아고 힘드러라.

서지훈의 이미지

아무래도 kernel쪽을 뒤져봐야 하지 않을까요?

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

jinyeong의 이미지

시스템이 뭔지는 모르겠지만, page size가 8k 군요..

pipe size 는 atomicity의 보장을 위해 page size와 같습니다.

이 size를 바꾸려면 _아마도_ multiple page 정도로 구성될텐데..

#define PIPE_SIZE n * PAGE_SIZE

이외에도

코드 부분도 꽤 손봐야 하지 않을까 생각됩니다.

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

alsong의 이미지

현재 시스템은 리눅스 2.4.X입니다.
Atomic을 보증하는 사이즈는 프로그램가이드를 보니 4K더군요.

파이프 크기를 관련자료를 찾기가 증말 어렵군요... ㅡ,.ㅡ(능력부족 ㅡㅡㅋ)
시스템 파라메터로 고치는 방법이 없는가요?

그리고 넌블럭 IO로 read write를 할때 atomic이 보증되는지요(예)
40바이트를 보냈을때 30바이트만보내고 리턴하게 되는지 궁금합니다.)
이것도 자료가 없군요.....
(이건 현재 테스트하려는 중입니다. 답이 없으면 제가 테스트해서 올리겠습니다. ^^);

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

jinyeong의 이미지

Quote:
현재 시스템은 리눅스 2.4.X입니다.
Atomic을 보증하는 사이즈는 프로그램가이드를 보니 4K더군요.

Architecture를 말씀 드린 것이었습니다. architecture에 따라 다릅니다.
i386은 아닐 것 같군요. 어떤 프로그램 가이드인지는 모르겠지만,
8k가 지원된다면 page size가 8k이고 이 size만큼
atomic이 보장될 것입니다. pathconf 등으로 확인해보시면 되겠군요.

그리고 pipe size는 kernel source에 hard coding 되어 있을 겁니다.

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

alsong의 이미지

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include "fifomsg.h"
int main()
{
        int fd, cnt = 0, ret=0;
        fmsghd_t fm;
        mkfifo(".TEST.fifo", 0600);
        printf("sizeof(fm) = %d\n", sizeof(fm));
        if((fd=open(".TEST.fifo", O_WRONLY)) == -1) {
                return -1;
        }
        fm.brige = 1;

        fcntl(fd, F_SETFL, O_NONBLOCK);
        while(1) {
                ret = write(fd, &fm, sizeof(fm));
                if(ret < 0)
                        perror("Error");
                else if(ret != sizeof(fm)) {
                        printf("___ttcnt = %d\n",  ret);
                        exit(0);
                }
                if(cnt++ % 10000 == 0)
                printf("fm.brigeid(%d) = %d\n", cnt++, fm.brige);
        }
        return 0;
}

Read를 열고 Write3개를 열고 8K로 나눠지지 않는 7byte로 테스트 해봤습니다
모두 한번에7byte 쓰기를 보증하는군요.....

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

서지훈의 이미지

fifo에서 자료의 보증은 system마다 다릅니다.
이 값은 PIPE_BUF 값에 의해 결정이 되는데...
FreeBSD는 512byte, linux 4K, SUN 5K, ... 이렇게 다릅니다.

이러한 내용은 Stevens 아저씨의 UNP Volume.2 에서 확인 할 수 있습니다.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

댓글 달기

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