리눅스와 유닉스상에서 다르게 돌아가는 소스...질문 좀 드릴게요

anaud2의 이미지

안녕하세요
GetPass라고 패스워드가 입력이 되면 *이 표시가되는 소스를 만들었습니다.
그런데 이함수가 termios구조체를 사용해서 화면을 제어하는것이라서 그런지 LINUX RHL4랑 sun os 5.9랑 전혀 다르게 동작을하네요
처음 구현은 리눅스에서 했구요 sun os 솔라리스5.9에 포팅을 하고 있는데 전혀 다르게 동작을 합니다.

리눅스상에서는 정상적으로 입력이 될때마다 *이 표시가 되고 백스페이스를 입력을 해도 지워지는데요

유닉스상에서는 *이 4개이상 입력이 되었을때 한번에 4개가 보여지게 되구요 또한 백스페이스까지는 잘되는데 화면에 변화가 없고 또한 엔터키가 안먹히네요

Termios가 운영체제에서 다르게 되는걸까요 아님 다른 문제 때문일까요 초보라서 쉽게 알아차리질 못하겠네요 동작을 안하는것도 아니구...도움좀 부탁 드리겠습니다.

#include 
#include 
#include 
#include 
 
static struct termios stored_settings;
 
void echo_off(void)
{
    struct termios new_settings;
    tcgetattr(0, &stored_settings);
    new_settings = stored_settings;
    new_settings.c_lflag &= (~ECHO);
    new_settings.c_lflag &= (~ICANON);
    tcsetattr(0, TCSANOW, &new_settings);
 
    return;
}
 
void echo_on(void)
{
    tcsetattr(0, TCSANOW, &stored_settings);
    return;
}
 
void get_pass(char *pass)
{
    char buf;
    int i=0;
 
    printf("Passwd:");
    echo_off();
    while( (buf = getc(stdin)) != 10 )
    {
        if(buf != 8)
        {
            pass[i]=buf;
            putc(42,stdout);
            i++;
        }
        else
        {
            pass[i-1] = 0;
            putc(8,stdout);
            i--;
        }
    }
    echo_on();
}
 
int main(void)
{
    char test[5+1] = "\0";
 
    GetPass("pass  ", test, 5);
    printf("inputpass[%s]\n",test);
}
revoman의 이미지

다음과 같이 수정하면 될 것입니다.

void echo_off(void)
{
    struct termios new_settings;
    tcgetattr(0, &stored_settings);
    new_settings = stored_settings;
 
    new_settings.c_lflag &= (~ECHO);
    new_settings.c_lflag &= (~ICANON);
/* 한번에 한글자씩 입력받도록 명시함 */
    new_settings.c_cc[VMIN] = 1;
    new_settings.c_cc[VTIME] = 0;
...
...
anaud2의 이미지

이렇게 명쾌하게 해결을 해주신점~정말로 감사 드립니다.

마지막으로 궁금한게 있어서 질문을 드립니다.
termio구조체에서 제어문자 속성값 -c_cc에서
VTIME 과 VMIN은 제가 찾은 자료에는 없는데 신기하네요
제가 찾은 부분은 아래와 같습니다.

설명	c_cc 배열은 제어문자를 제어하기 위해서 사용한다. 즉 CTRL+X, CTRL+X, CTRL+C 등의 문자와 관련된 제어를 할수 있다. 
VINTR:	일시중지(Ctrl+C)와 관련된 제어이다. 만약 ISIG 플레그가 on 되어 있다면 일시중지 문자를 입력시키면 포그라운드 프로세스에 SIGINT 시그널이 발생된다. 
VQUIT:	Quit 제어문자 Ctrl+\ 와 관련된다. ISIG 플래그가 on 되어 있고 Quit 제어문자가 입력되면 SIGQUIT 시그널이 발생한다. 
VERASE:	ERASE 제어문자(백스페이스) 와 관련된다. 정규모드(ICANON) 플래그 가 on 되어 있고, ERASE 제어문자가 발생하면 가장 마지막 문자가 지워진다. 
VKILL:	KILL 제어문자 (Ctrl+u)와 관련된다.
VEOF:	Ctrl-d 제어문자와 관련된다. ICANON 플래그가 on 되어 있고, EOF가 발생하면 읽기 대기중인 모든문자들은 개행문자를 만나지 않더라도 바로 프로세스에게 전달된다. 
VSTOP:	STOP 제어문자(Ctrl+s)와 관련된다. 
VSUSP:	SUSP 제어문자 (Ctrl+z)와 관련된다. ISIG 플래그가 on 되어있는 상태에서 Ctrl+z 가 입력되면 모든 포그라운드 프로세스에 SIGSTOP 신호가 전달된다. 
VWERSE:	WERASE 제어문자 (Ctrl+w) 와 관련된다. 

revoman의 이미지

KLDP 검색창에서 VTIME 을 검색해보시면 많은 좋은 내용들이 나올것입니다....^^

댓글 달기

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