파이프가 임시 파일을 작성해야합니까?


11

파이프를 통해 두 프로세스간에 많은 양의 데이터를 전송하면 / tmp 디렉토리의 linux에 의해 일부 임시 파일이 생성됩니다. 파이프 작업이 성공하면 해당 임시 파일이 OS에 의해 자동으로 제거됩니다. 그러나 작업이 실패하면 tmp 파일이 그대로 남아 있습니다.

어떤 이유로, 사용자가 파이프를 통해 전송 한 데이터를 얻을 수있는 기회를 갖기를 원하지 않으므로 프로그램이 충돌하더라도 하드 디스크에 아무것도 남기고 싶지 않습니다. 어떻게해야합니까?


4
이 파일을 작성하는 OS가 특히 의심 스럽습니다. 특히 파이프 작업인지 의심 스럽습니다.

@ 닐 : 아주 좋은 지적입니다. @OP : 수신자가 stdin에서 수신 한 데이터를 tmp 파일로 캐싱하지 않습니까? 자신의 코드가 아니고 오픈 소스가 아닌 경우 발신자의 출력을 파일로 리디렉션 한 다음 입력 스트림으로 수신자 프로세스에 출력을 보내서 확인할 수 있습니다 (예 : sender > filenamethen) receiver < filename. 발신자 또는 수신자가 수행하고 있는지 확인하기 위해 두 ops 동안 tmp 파일을 확인했습니다.

2
답은 아니지만 파이프 처리에 대한 유용한 정보는 < slacy.com/blog/2008/12/on-mkfifo-and-inging-the-impossible >에서 발견했습니다. 이 사람이 얼마나 권위 있는지는 모르지만 그는 mkfifo생성 된 파이프는 버퍼링을 전혀하지 않으며 파일을 생성하지 않는다고 구체적으로 언급 합니다.
Carl Smotricz 2009

1
@Carl Smotricz : 링크가 끊어졌습니다. slacy.com/blog/2008/12/on-mkfifo-and-inging-the-impossible

또한 파이프가 너무 가득 찬 경우 파이프에 쓰면 차단됩니다 (누군가가 다른 쪽 끝을 읽을 때까지).

답변:


11
  1. 파이프는 디스크에 데이터를 저장하지 않습니다. / bin / echo foo | grep bar는 파일을 만들지 않습니다. 시도 strace -f sh -c '/bin/echo foo | grep bar' 파이프 라인을 실행할 때 쉘에 의해 만들어진 모든 시스템 호출을 볼 수 있습니다. echo셸이 내장되어 있으므로 /bin/echo셸을 실행 파일로 실행하도록 제안 했습니다.

  2. /tmp디스크에있을 필요는 없습니다. tmpfs에 마운트 할 수 있습니다 (예 : 가상 메모리로 백업). /tmp이 경우 에는 재부팅이 비워 지므로 /var/tmp남겨두고 싶은 곳에 사용하십시오.

당신이하고있는 일이 데이터를 파일에 넣는 것이라면 파이프를 사용하지 않는 것입니다. 파일이 일반 파일이 아닌 fifo 인 경우 이름이 지정된 랑데부 일 뿐이며 데이터를 포함하지 않습니다. ls -l을 사용하여 찾으십시오.

그리고 사용자가 자신이 소유 한 프로세스에서 파이프를 통과하는 것을 보지 못하게하려면 SOL이 많은 strace것입니다. 읽기 / 쓰기 mmapped 공유를 제외하고 프로세스 외부의 모든 항목과 상호 작용하는 프로세스가 수행하는 모든 것을 검사 할 수 있기 때문입니다. 기억. ltrace더 침습적입니다. 로컬 사용자가 루트 인 시스템에서 프로그램을 실행하는 경우 전혀 중지 할 수 없습니다. 유닉스에서 root는 무엇이든 할 수 있으며 목적을위한 강력한 도구를 가지고 있습니다.


1

실제 파이프는 커널의 메모리 블록으로, 일부 프로세스에서 읽거나 쓰는 버퍼입니다. 어디서나 파일을 만들지 않습니다.

일부 응용 프로그램에는 파이프 사용 (빠르거나 디스크를 타지 않고 메모리를 조금 더 사용)과 임시 파일 사용 (메모리를 덜 사용하고 임시 파일을 볼 수 있음) gcc아마도 다른 응용 프로그램 일지라도 그러한 응용 프로그램 중 하나입니다.


0

더티 해킹 : 두 프로세스를 모두 변경할 수있는 경우 데이터를 전송하기 전에 암호화하고 수신시 해독합니다.


실제로 그것을 더러운 핵이라고 부르지 않을 것입니다. 실제로 데이터가 민감한 경우 적절한 해결책으로 보입니다. 그러나 tmp 파일이 궁금합니다. 커널이 그것을 만드는 OP가 맞습니까? 아니면 Neil이 맞고 파이프의 한쪽 끝이거나 다른 쪽 끝입니다.

커널이 임시 파일을 작성하지 않습니다. 반면에 수신 프로세스가 임시 파일을 작성하고있을 가능성이 큽니다. 입력을 찾으려면 먼저 파일에 써야하기 때문에 이것은 매우 일반적입니다.
Larsks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.