2011-03-17 2 views
4

커스텀 스크립팅 언어 용 리눅스 셸을 작성하고 있는데 사용자가 단일 명령문을 입력 할 때마다 "..."를 출력하고 싶습니다. 첫 줄에는 ">>> "인쇄 된 다음 입력을 기다리고 있습니다.터미널에서 입력을 출력과 동기화하는 방법은 무엇입니까?

>>> void f() { 
... "this is a test" 
... } 
>>> 

내가 fgets으로 라인을 읽고 있어요, 나는 완전히 읽은 후, 나는 인쇄 "..."fgets 또 다른 호출을 사용하여, 반복 : 다음은 예입니다. 이것은 적당히 빠른 대화식 입력에 적합합니다. 나는 단자에 코드가 포함 된 줄 바꿈을 붙여하지만, 내가 무엇을 얻을 것은 내가 stdout에 인쇄 한 후 나는 fflush 전화를 방출에도 불구하고,이 "..." 'ES 너무 늦게 인쇄 된 다음

>>> void f() { 
"this is a test" 
} 
... ... >>> 

입니다 . 이 일을하기 위해 특별한 것이 있는지 여부를 아는 사람이 있습니까?

+0

을, 단지 스트림 없습니다. 터미널 자체의 키 누르기 과정을 방해하려고합니다. 일반적으로 문자는 "프로그램을 읽을 준비가되었을 때"가 아닌 "입력 할 때"화면에 나타나며 붙여 넣기가 많이 덤프되는 것처럼 보입니다 한 번에 문자의. 예를 들어 에코를 사용 중지 할 수 있어야합니다. 비밀 번호 입력, 그래서 거기에 시설이 있습니다. ncurses. –

+0

@ 스티브 아 이제 봅시다. 나는 에코를 사용 안 함으로하고, 내가 읽은 텍스트를'printf'하고 싶을까요? 그 좋은 소리. –

+0

네,'printf' 그것, 아니면 일단 ncurses로 시작했다면 다른 ncurses를 써서 텍스트를 배치 할 수 있습니다. –

답변

1

터미널 에코를 끄면 (stty(1)-echo 참조) 입력을 화면에 인쇄 할 때 완전히 제어 할 수 있습니다.

필자의 가정은 붙여 넣기가 모든 행을 터미널에 동시에 작성하게하고 프로그램이 필요한 경우 출력을 터미널에 보낼 기회를 결코 얻지 못한다는 것입니다. 따라서 에코를 끄고 입력 할 때 사용자의 입력을 인쇄하면 개행 문자가 표시 될 때 특별한 처리를 수행 할 수 있습니다.

당신은 irb 프로그램이에 strace을 실행하여 매우 비슷한 않는 것을 볼 수 있습니다 : 당신이 그것에 대해 터미널 제어를 필요로 의심

ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 
... 
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = 0 
0

stdio를 사용하여 정말 간단하게 할 수있는 방법이 없습니다. 터미널을 제어하려면 ncurses과 같은 것을 사용해야합니다. 문제는 복사하여 여러 줄을 붙여 넣을 때 모두 read(2)에 대한 한 번의 호출로 stdin의 읽기 버퍼로 가져 오므로 stdout은 개입하는 프롬프트를 개입하여 인쇄 할 기회가 없다는 것입니다.