2009-02-04 3 views
5

개발중인 응용 프로그램에 필요한 기능이 있는데 명령 줄 프로그램이나 라이브러리를 사용하여 시스템 호출을 수행하면됩니다. 효율성이 문제가 아니라고 가정하면 라이브러리를 사용하는 대신 프로그램에 시스템 호출을하는 것이 나쁜 습관입니까? 이 일의 단점은 무엇입니까?라이브러리 함수를 대신 사용할 수있을 때 system() 함수를 사용하는 것은 나쁜 습관입니까? 왜?

이 시나리오의 예는 웹 서버에서 파일을 다운로드해야하는 응용 프로그램이 될 수 있습니다. cURL 프로그램이나 libcURL 라이브러리를 사용하여이 파일을 다운로드 할 수 있습니다.

답변

10

하나의 OS에만 코드를 작성하는 경우가 아니면 시스템 호출이 작동하는지 알 수있는 방법이 없습니다. 시스템 업데이트 또는 OS 업그레이드가 발생하면 어떻게됩니까?
절대 동일한 기능을 수행 할 라이브러리가있는 경우 시스템 호출을 사용하십시오.

+2

그냥 저녁 나는 작은 Perl 유틸리티 프로그램 몇 개를 살펴보고 File :: Copy - 새로운 버전이 더 짧고 Windows 대신 모든 플랫폼에서 작동하는 copy 명령에 대한 시스템 호출을 사용하여 바뀌었다. – Sol

2

보안 문제가 하나 있습니다. 악의적 인 cURL은 프로그램에서 혼란을 야기 할 수 있습니다. 이것은 코딩 속도가 주요 초점 인 개인 프로그램인지, 보안과 같은 요소가 중요한 요인이되는 상용 응용 프로그램인지에 따라 다릅니다.

3

의존성 문제로 인해 라이브러리를 선호합니다. 즉, 호출 할 때 실행 파일이 없을 수도 있지만 라이브러리가됩니다 (플랫폼에서 프로세스가 시작될 때 외부 라이브러리 참조가 처리된다고 가정). 즉, 라이브러리를 사용하면 시스템 호출보다 더 많은 환경에서보다 안정적이고 예측 가능한 결과를 보장하는 것처럼 보입니다.

3

고려해야 할 몇 가지 요소가 있습니다. 하나의 핵심 요소는 외부 프로그램이 소프트웨어가 설치된 모든 시스템에 있는지 여부에 대한 신뢰성입니다. 그것이 누락 될 가능성이 있다면, 아마 당신의 프로그램 안에서 그것을하는 것이 더 나을 것입니다.

무게가 가중되면 프로그램에로드 된 여분의 코드가 너무 길다는 것을 고려해 볼 수 있습니다. 응용 프로그램의 거의 사용하지 않는 부분에는 코드가 부 풀릴 필요가 없습니다.

system() 함수는 편리하지만 일반적으로 쉘을 호출하기 때문에 위험합니다. fork() 및 exec() 시스템 호출을 통해 Unix에서 직접 프로그램을 호출하는 것이 더 나을 것입니다. [우연히 시스템 호출이 system() 함수를 호출하는 것과 매우 다릅니다!] OTOH, 프로그램에서 열려있는 파일 디스크립터가 모두 닫혀 있는지 걱정할 필요가 있습니다 - 특히 프로그램이 대신 실행되는 데몬 일 경우 다른 사용자; 특별한 권한을 사용하지 않는다면 문제가 적지 만 호출 된 프로그램이 의도하지 않은 것에 대한 액세스 권한을 부여하지 않는 것이 좋습니다. fcntl() 시스템 호출과 FD_CLOEXEC 플래그를 확인해야 할 수 있습니다.

일반적으로 기능을 프로그램에 빌드하면 사물을 제어하기가 더 쉽지만 사소한 결정은 아닙니다.

1

안전하게 시스템 호출을 작성하는 것이 훨씬 더 어렵습니다.

모든 종류의 재미있는 문자를 올바르게 인코딩해야 인수를 전달할 수 있으며 인코딩 유형은 플랫폼 또는 명령 버전에 따라 다를 수 있습니다. 따라서 모든 사용자 데이터가 포함 된 시스템 호출을 만들려면 온 전성 검사가 많이 필요하며 실수를하기 쉽습니다.

1

그래, 위에서 언급 한 것처럼 시스템 호출 (fcntl() 및 open())과 system() 호출과의 차이점을 명심하십시오.:)

c 프로그램의 프로토 타입 작성 초기 단계에서 popen()을 사용하여 파일 조작을 위해 grep 및 sed와 같은 프로그램을 외부 호출하는 경우가 있습니다. 안전하지 않고 안전하지 않으며 확실히 이식 할 수 없습니다. 그러나 그것은 당신이 빨리 가도록 허락 할 수 있습니다. 그건 나에게 가치있는 일이다. 그것은 내가 프로그램의 정말로 중요한 핵심에 초점을 맞출 수있게 해주는데, 보통 내가 처음부터 c를 사용했기 때문입니다.

고급 언어에서는 꽤 좋은 이유가 있습니다. :)

0

대신에 유닉스를 사용하고 명령 줄 인수와 stdin을 사용하여 응용 프로그램 주위에 스크립트 프레임 워크를 빌드하십시오.

0

기타는 좋은 점 (안정성, 보안, 안전성, 휴대 성 등)을 언급했지만 - 나는 다른 것을 버릴 것입니다. 공연. 일반적으로 라이브러리 함수를 호출하거나 새 스레드를 생성하는 것이 여러 번 빠르며 전체 프로세스를 새로 시작하는 것입니다. 그런 다음 실행을 올바르게 확인/확인하고 출력을 구문 분석해야합니다.

관련 문제