2012-02-20 4 views
4

포크 빈()을 사용하지 않고 새로운 쌍의 tty (마스터와 슬레이브)를 만들어야합니다. PTS (4)의 남자 C 새 tty 포크

, 그 기록된다

프로세스/디바이스/ptmx를 개방

, 그것이 의사 단말 마스터 (PTM)에 대한 파일 기술자를 취득하고, pseudo-terminal slave (PTS) 장치는/dev/pts 디렉토리에 생성됩니다. C에서 작은 프로그램으로

, 나는 그렇게는/dev/ptmx 엽니 다

open("/dev/ptmx", O_RDWR); 

을하지만/dev에에서 만든 새로운 PTY가 없다//를 PTS.

+2

왜 forkpty()를 사용하지 않습니까? 이 숙제를 배정합니까? – Eregrith

+2

이전 질문에 대한 답을 수락하십시오 (도움이되었다고 가정). –

답변

4

실제 사용할 수있는 pty 쌍을 만들려면 공개 호출에 의해 반환 된 fd에서 grantpt (3) 및 unlockpt (3)도 호출해야합니다. 그 프로세스에서 파일 시스템의 실제 슬레이브 pty 파일 노드가 생성되는 곳을 잘 정의하지는 못합니다 - 일부 시스템 (/ dev/pts가 특별한 파일 시스템 인 곳)은 열린 시스템에서 생성하고, 다른 시스템은 생성합니다 그것은 grantpt 또는 unlockpt 호출의 일부입니다. 또한 슬레이브가/dev/pts에있을 것 같지 않습니다 - 어딘가에있을 수도 있으므로 - ptsname (3)을 호출하여 그 위치를 알아야합니다.

직접 열지 않고 posix_openpt (3)를 호출하는 것이 약간 더 휴대 가능할 수도 있습니다.

+0

실제로,'posix_openpt'는 이식 가능합니다 ('/ dev/ps/ptmx'는 리눅스에 고유합니다. 부가 가치가 없습니다). 지시 순서는 다음과 같습니다 :'posix_openpt'를 사용하여 마스터를 생성 한 다음'grantpt '로 마스터에 매개 변수로 권한을 부여한 다음'unlockpt'로 쌍을 잠금 해제 한 다음 나중에 슬레이브의 파일 이름을 가져 와서 엽니 다. 'ptsname'을 사용하여'ptsname'에 의해 반환 된 파일 이름을 보통'open'으로 엽니 다. 모두 POSIX 1에 설명되어있다. – Hibou57

+0

다음은 [POSIX의'ptmx'에 대한 내용] (http://pubs.opengroup.org/onlinepubs/009696899/functions/posix_openpt.html)이다 : "표준 개발자들은 마스터 의사 터미널을 복제하기위한 특수 장치 인/dev/ptmx 장치를 추가합니다. 그러나 합의에 도달하지 못했고 새로운 기능을 추가하는 것이 다른 구현을 가능하게 할 것이라고 생각했다. "또한 리눅스'/ dev/ps/ptmx' 대신'/ dev/ptmx'를 어떻게 생각했는지 주목하라. – Hibou57

3

여기에 주제에 대한 좋은 튜토리얼 : Using pseudo-terminals to control interactive programs, pty, pdip

특히, "의사 터미널을 통해 프로세스 간 통신"제목 아래, 페이지의 중간에 샘플 소스를 봐주세요. 이것은 자체 프로세스를 포크하는 프로세스의 예입니다. 두 프로세스는 이전에 열었던 부모 프로세스 인 PTY를 통해 각 프로세스를 서로 통신합니다.