2013-10-01 2 views
0

2 개의 쓰레드를 실행하는 프로그램을 작성하고 싶습니다. 주 스레드가 작업을 수행하는 동안 다른 스레드는 대화식 cmdline 역할을하고 사용자 입력을 읽은 다음 터미널에 인쇄합니다.linux : 하나의 쓰레드를위한 멀티 쓰레드, 블록 터미널

내 코드는 이제 다음과 같습니다

#include <pthread.h> 

//Needed for pthread 
#ifndef _REENTRANT 
#define _REENTRANT 
#endif 

#include "whatever_u_need.h" 
bool g_isDone = false; 

void* cmdMain(void*) { 
    static char* buf; 
    buf = (char*)malloc(257); 
    buf[256]=0; 
    size_t size = 256; 

    while(!g_isDone) { 
     printf("> "); 
     getline(&buf, &size, stdin); 
     if(buf[0] == 'q') { 
      g_isDone =true; 
      break; 
     } 
     //echo 
     puts(buf); 
    } 
    free(buf); 
    pthread_exit(NULL); 
} 

pthread_t g_cmd_thread; 

int main() { 
    pthread_create(&g_cmd_thread, NULL, cmdMain, NULL); 
    while(1) { 
     //non-interactive jobs 
    } 
    pthread_cancel(g_cmd_thread); 

    return 0; 
} 

문제는,이 선 아래로 다음(), 나는 명중 입력 단자 이동의 getline을 실행할 때. 확실히 두 스레드가 모두 "ENTER 메시지"를 수신했습니다. 주 스레드에 대한 터미널 I/O를 끄고 다른 스레드의 명령 줄 기능을 유지하려면 어떻게합니까?

저는 bash 쉘과 함께 우분투를 사용하고 있습니다.

+0

@David Schwartz 편집을했습니다. – Kh40tiK

답변

2

은 입력 할 때부터 줄 바꿈을 유지합니다. 그런 다음 puts 버퍼와 puts 줄 바꿈을 추가합니다. 따라서 단말기는 두 줄 아래로 이동합니다. 사람 (3)의 getline에서

:

getline() reads an entire line from stream, storing the address of the buffer containing the text into *lineptr. The buffer is null-terminated and includes the newline character, if one was found.

사람에서 (3) 박았 :

puts() writes the string s and a trailing newline to stdout. 
+1

정확히 이런 식으로 맨 페이지를 확인했습니다. 나는 꽤 어리 석다. – Kh40tiK

0

내가 버그를 가지고 생각합니다. 기본적으로 puts()은 위의 코드에서 "이중 줄 바꿈"효과를 생성하는 stdout에 후행 후미 줄 바꿈을 추가합니다. 이 버그는 멀티 스레딩과 전혀 관련이 없습니다.

다음 번에 맨 페이지를 다시 확인해 보겠습니다.

관련 문제