2013-05-13 5 views
1

나는 시스템 명령을 호출해야하는 프로젝트의 한 지점에 있습니다. 나는 원래 NSTask (가장 인기있는 접근 방법 인 것으로 보이기 때문에)를보기 시작했으나 최근에 나는 system 명령을 발견했다. NSTask보다 훨씬 쉬운 설정처럼 보입니다. 나는 몇 가지 질문/NSTask가 더 나은 방법이라고 답변을 본 적이 있지만 나는 장점이/두 NSTask vs System - 찬반 양론?

  • 사이의 단점은 무엇에서의 경우는 하나의 가능성을 사용하는 것이 무엇

    1. 표시되지 않습니다 다른보다 더

    어떤 도움/링크/생각/아이디어? (그리고 예 .. 나는 Google 검색을 했어)

  • 답변

    8

    NSTask :

    • 백그라운드에서 자신의 작업을 실행할 수 있습니다. 기본 프로세스에 인터럽트 및 강제 종료를 보내고 스레드를 직접 설정하지 않고 기본 프로세스를 일시 중단하거나 다시 시작할 수 있습니다. 그것이 원하는 것이라면 동기식으로 실행할 수도 있습니다.
    • 번치 변환을하지 않고도 NSString과 같은 Cocoa 수업을 진행 해보자.
    • 발신자와 다른 기본 프로세스에 대한 I/O 스트림을 설정해 보겠습니다.
    • system(3)보다 모든 Apple 플랫폼 (예 : iOS)에서 더 잘 지원됩니다. system은 iOS에서도 작동하지 않습니다.
    • 코코아 및 Objective-C가 필요합니다.
    • 쉘 인수를 해석하지 않거나 인수의 경로 확장을 수행하지 않습니다.

    system(3)은 :

    • 더 나은 모든 유닉스 플랫폼에서 지원.
    • 한 라이너로 작업을 실행할 수 있습니다.
    • C가 필요합니다.
    • 쉘에서 실행되며 /bin/sh과 같은 작업 디렉토리와 인수가 해석됩니다.

    코코아 앱의 경우 항상 NSTask을 사용합니다. 나는 C-only가 아니면 Mac 환경이 아닌 환경에서 실행해야하는 무언가를하고 있다면 system 만 사용합니다. 그대로, system은 매우 부서지기 쉽고 더 강력한 솔루션은 fork - exec입니다. 스트림 및 동시 작업을보다 잘 제어 할 수 있기 때문입니다.

    +1

    좋은 답변 - +1. 명확한 지점 : 심각한 위험없이 실제로는 'fork-exec'할 수 없습니다. 그것은 작동하지만 매우 부서지기 쉽습니다 ('NSTask'는이 깨지기를 피하기 위해 구현에서 많은 것들을합니다). – bbum

    +0

    그래, 나는 코코아에서 아무것도 포크 - exec하지 않을거야, 그것은 우리가 처음부터 그것을 버리는 경우에만 옵션입니다. – iluvcapra

    +0

    @bbum 포크/임원이 부서지기 쉬운 이유에 대한 설명이 있습니까? – koan

    7

    약간의 차이가있다. 그들 중 일부는 일반적으로 장점이 있는지 없는지 말할 필요가 없습니다.

    • system()은 쉘을 시작합니다. NSTask하지 마십시오.
    • system() 블록. NSTask는 비동기 적으로 실행됩니다.
    • system()은 args 만 사용합니다. NSTask는 파이프와 함께 작동합니다.
    • system()은 정수 종료 코드 만 있습니다. NSTask는 파이프와 함께 작동합니다. (예, 다시 언급합니다. 출력용입니다.)
    • system()은 완전한 명령 줄을 사용합니다. NSTask args는 배열로 전달 될 수 있습니다.
    • system()은 현재 디렉토리에서 실행됩니다. NSTask하려면 작업 디렉토리를 전달할 수 있습니다.

    이것은 설명서를 다시 확인하지 않아도 약간의 차이가 있습니다. 개요입니다.

    +0

    답변 2 개를 모두 선택하십시오. 다른 응답은 부서에서 조금 더 들어갔다. 당신 +1 +1을 받았습니다 –

    +0

    +1 주셔서 감사합니다. –

    +0

    @ AminNegm-Awad 나는 당신의 대답을 우연히 발견했고 그것은 두 시간 만 구해주었습니다. 돌아올 때 나는 말할 좋은 이야기가있다. 당신의 대답을 충분히 upvote 수 없습니다. 위의 6 가지 사실을 모두가 암기해야합니다. –