pipe가 비어있는지 확인하는 함수가 있나요?

dgsquare의 이미지

pipe를 간단히 구현하고 있고요.
blocking/IO Mode로 사용하고 있습니다.
process간 전송은 pipe로 진행되고 있으며, 마지막 명령이 끝난 결과값을 화면으로 출력시켜주기 위하여, read하여 buffer로 보낸뒤 출력시킬려고 합니다.
근데, 어떤 명령들은 출력이 없습니다. 이렇게 출력이 없는상태에서 read가 일어나면 blocking되면서 누군가 pipe에 write할때까지 기다리는 것으로 알고 있습니다. 이런것을 처리하기 위해 read전에 pipe가 비어있는지 확인하고 싶은데 방법이 있나요?
알수가 없으면, 결국 flag를 설정해야 할것 같은데 로직이 복잡해질 것 같아서여 :shock:

결론은 pipe에서 read하기전에 비어있는지 확인하는 함수가 있는지 알고 싶습니다. 뭐 방법이라도 알려주시면 감사하구요-!
(매번 질문하기도 미안해 검색으로 찾아봤는데, 잘 안나오네여 ^^)

morris의 이미지

ioctl(pipe, FIREADON, ...)

이렇게 하면 안되나요?

소켓에는 되는데 아마 파이프에도 될거 같네요

얼마나 읽을게 남아있나 확인해줄겁니다.

dgsquare의 이미지

Quote:
ioctl(pipe, FIREADON, ...)

죄송하지만 사용법이 어떻게 되는지..
manpage에도 없고, 검색을 해봐도 나오지 않네여..

익명 사용자의 이미지

poll 이나 select를 써서 읽기 전에 readable 한지 체크하는건 어떨까요? -_-?;;

dgsquare의 이미지

그 readable한지 알수 있는 방법이 없는지 알고 싶습니다-_-;
write할때마다 falg설정을 해주면 되지만, 로직이 많이 목잡해 지는것 같아서여.
어느 책에 얼핏 나온 것을 본것도 같은데, 도서관에서 찾아봐야겠습니다...
암튼, 답변감사합니다 :)

smoon의 이미지

timeout 을 작게주고 select나 poll이 time expire로 종료하느냐 아니냐로 체크하면 되지 않을까여?

ioctl에서 FIONREAD였나 그 비슷한걸 써도 될꺼 같은데 그부분은 잘 기억이 -_-;;;

amister의 이미지

흠. ioctl과 FIONREAD에 대해서 검색해보시면 금방 아실 수 있었을텐데요...

int nbytes;
ioctl(fd, FIONREAD, &nbytes);

위 코드를 통해 해당 fd로부터 바로 읽어들일 수 있는 데이터가 몇 bytes인지
알 수 있습니다.

하지만 이렇게 체크하는 방법은 방법이 그다지 좋지 않다고 생각합니다.

command를 보내고 그에대한 결과가 있을 경우는 pipe에서 결과를 받아 출력
한다고 할 때, 결과가 있는지 없는지를 체크하기 위해서 pipe에 read할 데이터
가 있는지 체크해보는 것은 위험한 방법입니다. pipe 로부터 결과가 언제 올지
모르기 때문입니다. 결과가 올 command라면 당연히 read() 하고 있어야 하며
결과가 오지 않을 command라면 그냥 계속 진행하면 됩니다.

하지만 결과가 오지 않을 command라도 성공여부를 확인하고 싶다면 모든
command에 대하여 결과가 리턴되도록 프로토콜을 변경하시는 것이 좋을
것입니다. 복잡하게 고민하지 않아도 되며, 가장 확실하게 성공/실패를 알 수
있는 방법입니다. 오버헤드가 생각보다는 훨씬 작으므로 이렇게 하시는 것이
좋을 것입니다.

dgsquare의 이미지

답변 감사합니다- 결국 다른 방식으로 짜게 되었지만,
많은 도움이 되었네여.
좀더 인내를 가지고 찾아보는 습관을 가져야 겠습니다. :)

댓글 달기

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