named pipe에서 데이터를 읽기 위해 select를 사용하는데 질문이 있습니다.

baramseo의 이미지

named pipe에서 데이터를 읽기 위해 select를 사용하는데
처음에 server를 실행하면 시간내에 못읽으면 0을 반환하여 의도한 대로 동작을 합니다.(데이터 없음 메시지 출력)

그런데 client가 파이프 파일을 열었다 닫으면
읽을 데이터가 없는것 같은데도 select는 계속 read_fd를 셋팅해줍니다.("데이터 읽음 : "메시지 무한반복)

소스는 아래와 같습니다.
왜 이런현상이 발생하나요?
검색능력이 떨어져서 구글에서 몇 시간동안 뒤져봤는데 답을 못찾았습니다.
고수 분들의 도움을 기다립니다.^^ 꾸벅.

halfduplex.h
#define HALF_DUPLEX	"/tmp/halfduplex"
#define MAX_BUF_SIZE	255

server.c
 
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "halfduplex.h" /* For name of the named-pipe */
#include <sys/time.h>
 
int main(int argc, char *argv[])
{
    int fd, ret_val, count, numread;
    char buf[MAX_BUF_SIZE];
 
        int is_select;
        fd_set fd_read;
        struct timeval  time_val;
 
    /* Create the named - pipe */
    ret_val = mkfifo(HALF_DUPLEX, 0666);
 
    if ((ret_val == -1) && (errno != EEXIST)) {
        perror("Error creating the named pipe");
        exit (1);
    }
 
 
    /* Open the pipe for reading */
//    fd = open(HALF_DUPLEX, O_RDONLY);
    fd = open(HALF_DUPLEX, O_NONBLOCK);
 
    /* Read from the pipe */
        while (1)
{
        FD_ZERO(&fd_read);
        FD_SET(fd, &fd_read);
 
        time_val.tv_sec = 1;
        time_val.tv_usec = 0;
        is_select = select(fd+1, &fd_read, NULL, NULL, &time_val);
 
 
        if (is_select > 0)
        {
            numread = read(fd, buf, MAX_BUF_SIZE);
            buf[numread] = 0;
 
            printf("Half Duplex Server : Read From the pipe : %s\n", buf);
                if (buf[0] == 'x')
                        break;
 
        }
        else
                printf("Noting to read...\n");
}
 
        return 0;
}

client.c
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "halfduplex.h" /* For name of the named-pipe */
 
int main(int argc, char *argv[])
{
    int fd;
        char buf[100];
 
 
    /* Check if an argument was specified. */
 
 
    /* Open the pipe for writing */
    fd = open(HALF_DUPLEX, O_WRONLY);
    close(fd);
 
   return 0;
}

cococo의 이미지

그러니까,

rv = read( fd, buf, size )

에서 rv != size 라서 그런 건 아니구요?

행복은 희생없이는 얻을 수 없는 것인가?
시대는 불행없이는 넘을 수 없는 것인가?

terzeron의 이미지

왜 nonblocking mode로 open하셨나요?
이러면 다 읽지도 않았는데 read()함수에서 return됩니다.
이 옵션을 빼고 open해보시는 걸 추천드립니다.

명확한 이유가 있다면 사용할 수 있지만, 얼핏 살펴본 코드에서는
특별히 그럴 이유가 없어보입니다.

댓글 달기

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