2011-09-06 1 views
3

리눅스에서 fmemopen 파일 디스크립터 (부모 버퍼를 가리키고 있음)를 가지고 있는데, C에서이 파일을 설정하고 싶습니다. 자식 프로세스 (코드에 대한 액세스 권한이없는 사용자)의 표준 입력으로 사용되는 설명자.fmemopen ed 파일 디스크립터를 자식 프로세스의 표준 입력으로 설정하기

가능합니까? 그렇다면 어떻게해야합니까? 가능하다면 디스크에 쓰지 않아도되고 싶습니다.

+0

분명히하기 : mmap을 사용하여 실제 파일에 실제로 연결되어 있지 않은 fd에 쓰고 싶습니까? –

+0

죄송합니다. 잘못된 기능을 사용하고있는 질문을 작성할 때 실제로 원하는 파일은 fmemopen 파일입니다 (예 : 파일처럼 사용할 수있는 메모리 블록). 필자는 필요하다면 모든 것을 표준화 할 수 있다고 생각하지만, 나는 그것을 피하고 싶습니다. – user439407

답변

1

이 불가능합니다. 상속 stdin/out/err은 순전히 FILE 스트림이 아닌 파일 설명자를 기반으로합니다. fmemopen은 파일 기술자를 생성하지 않기 때문에 새로운 프로세스의 stdin/out/err이되거나 프로세스 간 통신에 사용될 수 없습니다. 찾고자하는 것이 파이프를 필요로하는 경우, 탐색이 필요하지 않은 경우 임시 파일이 필요합니다. tmpfile 함수는 파일 시스템에서 보이는 이름을 만드는 것에 대해 걱정할 필요없이 하나의 함수를 만드는 데 사용될 수 있습니다.

0

직접 fd를 사용할 수 있는지 확실하지 않은 경우 (dup2() 일 경우), 그렇지 않은 경우 pipe()을 만들어 메모리 내 데이터를 제공하고 클라이언트가이를 수신 할 수 있습니다 . 여기에도 ing 이후에 dup2()을 입력해야합니다.

0

단지 분기 전에 mmaped 파일 기술자가 파일 기술자 0 교체 :

int fd = ...; 
dup2(fd, 0); 
fork(); 
+1

어 .. 이걸 * 포크로 찍은 후에하는 것이 더 낫다. –

+0

네 말이 맞다! 나는 exec()를 생각하고 있었다. – arnaud576875

관련 문제