[완료]write()함수 blocking방지 위해 select()함수 사용 했으나 block되요 ㅠㅠ

yo-tteum의 이미지

안녕하세요. 우선 문제가 되는 코드 부분은 아래 코드입니다.
------------------------------------------------------------

do
        {
    //      // set write timeout
            tv_write_timeout.tv_sec = 0;
            tv_write_timeout.tv_usec = 100000; // 0.1 sec
            // set write select()
            FD_ZERO(&wfds);
            FD_SET(fd, &wfds);
            printf("tx select before cur %u tx %d rx %d\n", loop_cur, tx_fail_cnt, timeout_cnt);
            retval = select(fd + 1, NULL, &wfds, NULL, &tv_write_timeout);
            printf("tx select after %d\n", retval);
 
            if( retval == -1 )
                return -10;
            else if(retval)
                byte_written = write( fd, buf_trans + cur, len - cur );
            else
                return -24;
            printf("tx write after\n");
            //sleep(2);
        } while( (byte_written < 0) && (errno == EINTR) );

-------------------------------------------------------------
실행 결과 로그가 아래처럼 나오다가 멈춥니다.
------------
tx select before cur 1786 tx 0 rx 0
tx select after 1
tx write after
waiting ack loop 1786
dlc call before
tx select before cur 1787 tx 0 rx 0
tx select after 1
------------
write()함수에서의 블록킹을 방지하려고 먼저 select를 불렀는데 타임아웃이 걸린것도 아니고 -1이 리턴된것도 아닙니다.
1786번째는 select 리턴이 1이고 제대로 썼는데 1787번째 쓰기에서는 select가 동일하게 1을 리턴했습니다만...
그럼 fd에 write를 할 수 있으니까 select가 리턴했을 텐데 왜 write()를 하려고 하면 거기서 블록킹이 되어 있을까요.
read()쪽에도 비슷하게 select를 사용중인데 거기서는 아직 문제가 발생하지 않았습니다. 해당 fd를 open할 때 NONBLOCK으로 열 수 도 있는데
그럴 경우 read()쪽에서 timeout을 판단하기가 좀 복잡해져서 기본적으로 BLOCK모드로 쓰고 select를 통해서 timeout을 감지해내려고
하는데 ....select가 뭘 보고 리턴을 했는지 모르겠네요. 고수님들 조언 부탁드립니다. write()쪽만 select대신 원시적인 SIGALM을 써야 할까요. 흠..아 참고로 저기서 쓰는 fd는 소켓도아니고 일반 파일도 아니고 가상으로 만든 tty드라이버에 대한 fd입니다. 뭔가 표준을 따르지 않아서 select가 잘못 판단한 것일까요? 제발 조언 부탁드립니다. 감사합니다.
ihavnoth의 이미지

termios 설정이 어떻게 되나요?

그리고 아래는 제가 minicom 대신 사용하는 프로그램입니다.

NONBLOCK 모드지만 소스가 짧아서 참고하기 좋습니다.

http://brokestream.com/com.c

없음

sohn9086의 이미지

select의 리턴 값이 -1도 0도 아니면 무조건 write하려고 하시는 것 같은데, write하기 전에 FD_ISSET을 써서 진짜 write해도 되는지 확인해 본 후 write해 보시면 어떨까요?

또 한가지 걸리는 건 fd인데 여기서 fd가 나타내는 파일 디스크립터는 디스크상의 파일을 나타내나요, 아니면 직접 작성하신 디바이스 드라이버인가요? 만약 후자라면, 그 디바이스 드라이버의 poll과 write 파일 오퍼레이션에 문제가 없는 지 확인해 보시기 바랍니다.

생산적인 댓글을 달자

goomi의 이미지

signal(SIGPIPE,SIG_IGN); 이 함수 쓰면 인터럽트(블로킹) 발생을 막는데 사용했던걸로 기억이.... 가물가물

yo-tteum의 이미지

진심으로 감사드립니다. fd는 직접 작성한 디바이스 드라이버 입니다. 네 그래서 뭔가 그안에서 irq disable해버리고 먹통 되어버리면 select의타임아웃도 안걸리고 이상해 지는 것 같아요. 감사합니다. ㅠㅠ

댓글 달기

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