- 나는 다른
popen()
또한dup()
- STDOUT (PHP를 예를 들어 같은) 다른 프로세스에서 호출 프로그램 또는 SSH를 통해, 프로세스가 종료되지 않습니다를했습니다.
process_test.c
: gcc process_test.c
와dup() 및 popen()이 다른 프로세스에서 호출 될 때 내 프로세스가 종료되지 않는 이유는 무엇입니까?
#include <stdio.h>
#include <unistd.h>
int main() {
int out;
out = dup(STDOUT_FILENO);
// close(out);
popen("sleep 10\0", "r");
}
컴파일, 실행 :
./a.out
이 -> 정상적으로 종료ruby -e 'system("./a.out");'
-> 일반적으로php -r passthry("./a.out");
를 종료 ->는 를 중단
ssh remotehost ./a.out
- 나는dup
표준 출력을하지 않거나 DUP를 닫을 때>는이 나에게 내가하고 싶은 동작을 보여줍니다 내가 찾을 수있는 가장 짧은 재현 코드
을 끊지 않고,
fork/pcntl/etc를 사용하여 여러 PHP 응용 프로그램/프레임 워크에서이를 추출하는 데 몇 시간이 걸렸습니다. 즉, 나는 이것을 쓴 것이 아니고 이것을 만들었다. 그러나 명백하게 그것의 전체의 감각은 내가 모든 것을 떼어 놓기 때문에 길을 잃었다.
나는 당신이 쓴 것을 읽을 수 있지만 문구 중 일부는 혼란 "... 0과 2 채널로을 togheter 채널 2를 닫습니다 ..."무슨 일이 있는지입니다 무슨 뜻이야? 그리고 질문 : 피 호출자 (ssh)가 프로세스가 수행하는 내부 세부 사항에 의존하는 이유는 무엇입니까? 예 : popup() 후에 sup도 빠져 나가지 않을 것이다. – mark
필자는 내 질문에 대해 다시 한번 말하고 ** ** popen 후 fd **를 닫아도 상황을 설명하지 않고 끝내지 않을 것이라고 덧붙였다. – mark
소스 코드를 보면 ssh 프로세스가 rlogin 또는 telnet과 같습니다 : 원격 프로그램과의 연결 및 설정을 시작한 후 원격 프로그램의 입력 채널에 매핑 된 ssh의 입력 채널이 있으므로 채널 1의 경우 2. ssh는 모든 채널이 열렸을 때 연결을 닫습니다 (예 : 0, 1, 2). 그래서 당신이 다른 작품을하기 위해서 1 채널을 복제했기 때문에 ssh는 그 프로세스가 끝나고 복제 된 채널 1을 닫을 때 끝날 것입니다. 설명하기가 매우 복잡해 보이는데 30 년 전 그런 행동을 많이했습니다 .... – gaetanoM