나는 간단한 C 프로그램을 작성하지있을 경우에도 성공) (getlogin이된다. 나는 제어 터미널이 없다는 것을 확인함으로써 getlogin()을 만들지 못하게 만들었지 만 여전히 로그인 이름을 얻고 그것을 인쇄하고 있습니다. 설명의 방식으로는 왜 제어 터미널
#!/bin/bash
for i in $(env | grep -vP ^PATH\\b | awk -F= \{print \$1\}); do
unset $i;
done;
(tty; perl -e 'setpgrp; sleep(1); exec(qw(getlogin_test));') &
: 가장 극단적 인 예는이를 입증 할 않은 세트 PATH 제외한 모든 환경 변수를하고 나서 펄 인스턴스 'TTY'을 실행하는 서브 셀을 실행; 하위 셸이 백그라운드로 설정됩니다. setpgrp를 호출하여 프로세스 그룹을 사용하여 부모의 제어 터미널을 찾지 못하게합니다 (나는 그렇게하지 않는다고 생각하지만, 가정이 잘못되었을 때를 대비해 넣습니다).
이 시점에서, 나는 손실에 처해있다. 여전히 사용자 이름이 인쇄됩니다. 나는 꽤 많은 소스에서 본 것보다 간단한 예는 동일한 동작이 있습니다
sh -c 'time perl -e '"'"'$|=1; print getlogin(), chr(10);'"'"' &'
sh -c 'time perl -e '"'"'$|=1; print getlogin(), chr(10);'"'"' & wait'
이 모두 여전히 펄의 서로 다른 버전의 솔라리스 10과 레드햇 (6) 모두에서 사용자 이름을 인쇄, 배쉬, 쉬, 및 tcsh.
getlogin이은() 가능성이 확보되지 않은 사용자 이름을 알아 내기 위해 무엇이든 그것을 할 수있는 노력하고있다. –
당신의 프로세스는 여전히 제어 터미널을 가지고 있습니다. 당신이 어떤 단계를 거쳐야하는지 확실하지 않습니다. – nos
@nos 나는 백그라운드에서 던지면 제어 터미널을 제거해야한다는 인상 아래에있었습니다. –