간단한 프롬프트를 만드려고 합니다. 표준입력 내용을 보존하고 싶습니다.

ep6tri의 이미지

C/C++로 간단한 프롬프트 프로그램을 만드려고 합니다.
mysql 프롬프트 같다고 생각하면 됩니다. 프로그램을 실행하면 아주 단순한 프롬프트가 나오면 됩니다.

한편 이 프로그램은 스레드나 프로세스를 만들어서 다른 역할을 하나 더 수행하는데,
표준 출력으로 문자를 출력하는 부분도 있습니다.

그러니까, 이런 셈이지요

int main()
{
 
  // 스레드를 2개 생성합니다.
  // 스레드 1은 프롬프트로 입력을 받는 함수를 수행합니다.
  // 스레드 2는 어떤 역할을 수행합니다. 문자열을 출력하기도 하지요
 
  .... 적절한 코드 ....
}
 
void* function1( ... )
{
스레드 1번이 수행하는 함수입니다.
프롬프트를 띄우고 사용자로부터 입력을 받습니다.
fgets(...) ...등을 사용합니다.
}
 
void* function2( ... )
{
스레드 2번이 수행합니다. 어떤 일을 하고, 표준 출력으로 메시지를 보내기도 합니다.
}

그러다 보니 이런 문제를 발견하였습니다.
사용자가 열심히 타이핑을 하는 중에 스레드 2번이 메시지를 출력하였습니다.

별다른 처리를 하지 않으면 스레드 2번이 출력하는 메시지 때문에
1번 스레드에서 입력 중인 내용이 모니터에서는 사라져버립니다.

엔터를 쳐서 입력된 내용을 확인해보면 처음부터 입력한 내용이 전부 출력므로,
내용이 유실되는 것이 아닌 것은 다행입니다.

하지만 2번 스레드가 출력을 끝마친 후에는 사용자가 입력된 내용이 모두 보존되어 나와 있는 것이
더 좋아 보입니다.

하지만 막상 그렇게 하는 방법은 모르겠습니다.

제가 생각한 방법이 가장 매끈하게 표현되어 있는 것으로는 배쉬 쉘이 있겠네요..
메시지가 출력되는 중에도 입력을 넣을 수 있고, 출력이 끝난 후 입력된 내용이 프롬프트와 함께 가지런히 잘 보존되어 나옵니다.
입력한 문자를 백스페이스로 다시 지울수도 있구요.
어떻게 이렇게 하는지 궁금합니다.

구현하는 방법이 어렵다면, 호기심으로 원리나마 알고 싶습니다..
도움을 부탁드립니다.

planetarium의 이미지

스레드 2의 출력 내용을 표준 출력으로 바로 보내지 않고
일단 버퍼에 보존하였다가 적절한 타이밍 (프롬프트가 뜨기 직전 등) 에
flush 를 시켜주면 어떨까요?

댓글 달기

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