2011-05-06 2 views
6

나는 getty/agetty/mgetty 프로그램의 기능이 리눅스/유닉스 시스템에 무엇인지 명확하지 않다.파이썬 TTY 컨트롤

TTY = '/dev/tty3' 

cpid = os.fork() 
if cpid == 0: 
    os.closerange(0, 4) 
    sys.stdin = open(TTY, 'r') 
    sys.stdout = open(TTY, 'w') 
    sys.stderr = open(TTY, 'w') 
    os.execv(('/bin/bash',), ('bash',)) 

을 .. 그리고 내가이 tty3로 전환하는 경우,이 쉘 running-하지만 일부 키 입력 쉘로 전송되고 있지 않습니다/무시됩니다 :이 같은 뭔가가있는 청각 장애에 쉘을 시작할 수 있습니다. 쉘은 'tty를 열 수 없습니다, 작업 제어가 비활성화되었습니다'와 같은 bash가 있기 때문에 TTY 설정이 올바르지 않다는 것을 알고 있습니다. 'termios'모듈에는 TTY의 설정을 변경하는 기능이 있습니다. 'tty'모듈을 사용하지만 파이썬이 올바르게 TTY를 설정하고 쉘을 시작하는 예제를 찾을 수 없습니다. 나는 그것이 단순해야만하는 것처럼 느껴진다. 그러나 나는 어디에서보아야하는지 모른다.

ME-C 도움이되지 않았다 *의 etty 프로그램의 소스보고는 나에게 그리스어과 같다 : -/

어쩌면 딱 맞는 용어를 찾는 게 아니 메신저? 누구나 과거에 * etty 프로그램을 Python으로 대체하고 공유 할 수있는 설명이 있습니까? 내 기본 질문 :

답변

4

당신이 놓치고 적어도 두 가지를 볼 수 있습니다 접대

감사합니다 - 더있을 수 있습니다 :

은 첫째, 당신은 마감 후 자식 프로세스에 setsid()를 호출 할 필요가 이전 표준 입력/표준 출력, 새 TTY 열기 전. 이는 두 가지 중요한 일을합니다. 즉, 새 프로세스를 새 세션의 리더로 만들고 이전 제어 터미널과의 연결을 끊습니다 (해당 터미널을 닫는 것만으로도 이 아니며이 아님). 이것은 새로운 tty를 열면 그것이 제어 터미널이되어 원하는 것임을 의미합니다.

둘째, 새로운 tty와 일치하도록 TERM 환경 변수를 설정해야합니다.

+1

os.setsid()는 모두 완료되었습니다. 나는 그것이 쉬워야한다는 것을 알았다. 고맙습니다. – tMC

0

* tty * 프로그램의 소스를 살펴 봐야합니다.

내 생각에 그들은 프로그램이 일반적으로 기대하는 모드 (예 : 로그인 등)로 터미널을 초기화하기 위해 대부분 ioctl 명령을 실행합니다. 그러나 그들 중 일부는 또한 사용자 이름을 묻는 메시지를 표시 할 수 있습니다 (암호가 아닌 로그인).