2012-06-15 2 views
2

NSTask의 출력을 파일로 직접 파이프하는 가장 좋은 방법은 무엇입니까? 나는 가능한 한 적은 양의 버퍼를 메모리에 저장하려고한다. (각 출력에 대해 다른 하나를 원하는 경우 또는 파일)을 NSTask를 시작하기 전에NSTask의 출력을 파일에 직접 파이핑?

답변

2

는 출력 파일 NSFileHandle에 표준 출력 및 표준 오류 (setStandardOutput:, setStandardError:)을 설정합니다.

NSFileHandle은 기본 OS 파일 디스크립터의 래퍼이며, NSTask은 지정된 출력에 연결하기 위해 적절한 작업을 수행합니다 (즉, dup (2)를 수행 할 가능성이 큽니다). 중간 메모리 버퍼는 도입되어서는 안됩니다.

NSTask이 시작되면 코드에서 NSFileHandle을 닫을 수 있습니다.

+0

왜 NSFileHandle을 닫아야합니까? 파일을 닫지 않으면 파일에 더 이상 데이터를 쓰지 않습니다. 그런 식으로 명령에 의해 생성 된 데이터는 쓰여지지 않을 것입니다, 그렇지 않습니까? – Alex

+0

@Alex - no. 기본 OS 파일 디스크립터는 열린 파일/파이프/소켓에 대한 * 참조 *입니다. 이 dscptr 중 일부는 고정 된 사용법을가집니다. 표준 입력, 출력 및 오류; 다른 프로세스는 파일을 열 때 할당됩니다 (dscptr은 실제로 작은 정수, 표준 입력의 경우 0, 표준 출력의 경우 1, 표준 오류의 경우 2). 'setStandardOutput :'와 친구들이하는 일은 임의의 dscptr와 * duplicate *를 새로운 작업의 프로세스의 해당 std dscptr에 가져 오는 것입니다. 프로세스가 시작된 후 원본 dscptr을 닫아서 파일을 std에 열어 두십시오. 자세한 내용은 C/Unix 가이드를 참조하십시오. – CRD

관련 문제