termois 구조체중에 c_c[VMIN]의 최대치?

익명 사용자의 이미지

컴파일중에 c_c[VMIN]의 크기를 넘어섰다는 워닝메세지가 나옵니다.
스트럭쳐의 크기를 받았는데요,

질문 하나는, c_c[VMIN]은 byte로 받는다고 했는데,
sizeof(struct xxx)는 bit인걸로 알고 있습니다.
어떻게 크기를 맞춰줄 수 있을까요.
== 현재는 c_c[VMIN] = sizeof(struct xxx); 로 해주고 있습니다만...

두번째는
이런식으로 하다보니,
c_c[VMIN]의 최대 범위를 넘어섰다는 워닝 메세지가 나옵니다.(컴파일시에)
그렇다면 c_c[vTIME]으로 제어해줘야 하는데, 이것을 쓸 수 없을때 어떠한 방
법으로 제어를 해 줘야 하는지 궁금합니다.

그럼 건승하십쇼!

익명 사용자의 이미지

termios structure의 c_cc[VMIN]에 대해서 질문하는 것 같습니다.

sizeof(struct xxx)는 구조체의 바이트 수를 integer 수로 표현해 주는 연산자입니다.

보통 noncanonical mode에서 c_cc[VMIN] 값을 1로 해 주니까 이런 경우를 접해 본 적은 없지만
아무래도 unsigned char 데이터 타입의 자료형에 integer 값을 잘못 할당해서 그런 것 같은데..
잘 모르겠군요...

익명 사용자의 이미지

답변 감사합니다.

그런데.. 몇가지 궁금한게 있어서요..(참고로 전 리눅스 프로그램은 초짭니다)

말씀중에 보통 비동기화에서는 c_cc[VMIN]을 1로 잡고 쓰신다고 하셨는데요,
이점이 궁금합니다.

제가 레퍼런스를 보고 이래저래 해 봤는데요,
비동기 모드로 받을때 얼만큼의 바이트를 받느냐를 c_cc[VMIN] 을 이용해서 지
정해 준다고 본것 같습니다.

실제로 프로그램 상에서 구조체를 넘겨 받을때(read) 비동기 모드로 해서
c_cc[VMIN] = sizeof(struct xxx);
read(.....) 로 받고 있거든요, 물론 다른 구조체를 받을때는 또한번 c_cc
[VMIN]의 수치를 지정해줍니다.

제가 이 방법을 쓰게 된 중요 이유는, 동기모드에서 CR이 오지 않으면 read의
블록이 해제되지 않기 때문에 이런 방법을 썼거든요,

사실 부끄럽지만 이 방법을 쓰기 전에는 구조체를 보낸 후에 다시 0x0d를 포함
한 캐릭터를 날려서 read의 블록을 해제시키는 꽁수를 썼습니다.
전 이게 싫었던거죠.. 또 안좋은 방법이기도 하구요..

이 점에 대해서 첨언이나 조언 부탁 드립니다.
그 수 많은 termios 구조체중에 어떠한것이 이러한 문제를 제어하는지 전 도
통 모르겠군요.. 리눅수의 레퍼런스는 너무 추상적이예요.. 흑흑..

그럼 건승하세요..

익명 사용자의 이미지

글쎄요. 제가 공부가 부족한지 질문이 정확한 의미를 파악하기 힘들군요..

우선 비동기 I/O라고 하면 SIGPOLL이나 SIGIO같은 시그널을 이용해서 특정한 file descriptor가
I/O 준비가 되어 있다고 커널에게 알리는 방법이라고 알고 있는데, 질문에서 사용하고 있느
"비동기"라는 말이 noncanonical mode랑 같은 뜻인지 궁금하네요.

제가 noncanonical mode에서 c_cc[VMIN]을 보통 1로 한다고 한건, vi와 같은 터미널 인터페이스의
프로그램을 염두에 둔 것입니다. c_cc[VMIN]을 1로 하고 c_cc[VTIME]을 0으로 하여 한번에
한 글자씩(special character를 포함하여) 입력받으니까요..

참고로 noncanonical mode에서 필요한 만큼 read했을 때 즉시 리턴하도록 하려면
c_cc[VTIME]을 0으로 지정해 주면 됩니다.

그리고 구조체를 받는다고 하셨는데, 터미널 디바이스에서 구조체를 받는건가요?

여하튼 제가 아는 만큼 도움을 드리고 싶은데, 문제가 뭔지 정확히 이해가 안되는군요.
termios 구조체에 대해 저는 W. Richard Stevens의 Advanced Programming in the UNIX
Environment라는 책의 11장을 공부했는데, Unix System Programming 공부하시기에 아주
좋은 책이라고 생각합니다. 이 책을 추천하고 싶군요..

익명 사용자의 이미지

* MIN > 0 , TIME = 0

read는 MIN 문자를 읽어들일수 있을 때까지 기다리고 나서 해당문자의 수를 반
환할 것이다.
파일의 마지막에서는 0이 반환된다..

라고 되어있네요. 실행해보니... c_cc[VMIN] 의 문자를 읽을때까지 계속 입력
받고...
반환값은 입력받은 문자의 값 이네요. ( 'a' = 97 )

c_cc[VMIN] 에 어떤 형(구조체 따위)의 크기가 들어가는건 아니지 않나요? ^^?

도움이 된건지 어쨌는지 모르겠네요 ^^;

P.s 혹시 하향지훈 님이세요? ^^?

전~~ 에 'C언어 배우는곳' 에서 많이 도움받은 기억이 납니다~!

그때 감사했습니다~! )

익명 사용자의 이미지

아마 터미널 IO 프로그램을 작성 중인 모양인데요.

일반적으로 VMIN과 VTIME의 상관관계는 이렇게 됩니다.

VMIN > 0 && VTIME > 0 이면 일정 문자가 들어 오든 시간이 종료 되던
VMIN == 0 && VTIME > 0 이면 시간이 종료될때까지.
VMIN > 0 && VTIME == 0 이면 일정 문자가 들어올때까지.
VMIN == 0 && VTIME == 0 즉시 Return합니다.

시간은 (1/1000)이고요 Min은 문자 단위입니다.
그런데 이렇게 해서 사용하는 것보다는
poll이라는 함수를 통해서 사용하는게 능률적일수 있습니다.
poll(pollfds, count, time) --> time 1/1000초

참고로
통신프로그램을 직접 작성중이라면 프로토콜을 만드시는것이 좋을 것입니다.
그게 아니고 다른시스템의 MMC(Machine Command)를 통한 조작이라면
구현에서 고생 할겁니다. 어느정도 인간의 판단력을 컴퓨터 옮겨야 하니까요.

댓글 달기

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