본문

NSProcessInfo Class 참고자료

NSProcessInfo 클래스는 현재 실행중인 프로세스에 대한 정보에 접근하기 위한 메소드를 제공한다. 각각의 프로세스는 '프로세스 정보 에이전트'라고 불리는 하나의 공유된 NSProcessInfo 객체를 포함한다.

'프로세스 정보 에이전트'는 인자, 환경 변수, 호스트 이름, 혹은 프로세스 이름과 같은 정보들을 반환 해 줄 수 있다. '프로세스 정보 에이전트' 내에 있는 processInfo 라는 '클래스 메소드'는 이 메소드가 호출된 현재의 프로세스에 대한, 공유된 프로세스 정보 에이전트를 반환한다. 아래의 코드는 NSProcessInfo 객체를 반환하고, 더불어 반환된 객체를 통해 현재 프로세스의 이름을 얻는 예제이다.

NSString *processName = [[NSProcessInfo processInfo] processName];

또한 NSProcessInfo 클래스는 operatingSystem 메소드를 포함하는데, 이는 프로세스가 실행되고 있는 운영체제를 구분할 수 있는 열거형 상수를 반환한다.

NSProcessInfo 객체는 환경변수와 명령줄 인자들을 처리할 때, 해당 문자열을 UTF-8(유니코드) 형태의 문자열로 변환하지 못할 경우 시스템 기본 문자열 인코딩으로 변환한다. 만약 이 두가지 변환방법에도 실패한다면 해당 값은 NSProcessInfo 객체에 의해 자동으로 무시될 것이다.

갑작스런 종료
Mac OS X v10.6은 어플리케이션을 강제종료함으로서 시스템의 로그아웃이나 종료과정을 더욱 빠르게 할 수 있는 '갑작스런 종료' 기능을 포함한다. 데이터 손상이나 나쁜 사용자 경험을 유발할 수 있는 행위가 발생할 때, 시스템 설정을 기본값으로 하되 사용 여부를 '갑작스런 종료'기능을 그때그때 수동적으로 변경함으로서 이 기능을 사용할 수 있다.  아니면 애플리케이션 자체적으로 수동적으로 설정함으로서 이기능을 활성화/비활성화 시킬 수 있다. 

enableSuddenTermination과 disableSuddenTermination 메소드는 하나의 프로세스가 생성되면서 기본적으로 1로 설정되는 카운터값을 감소하거나 증가시킬 수 있다. 카운터의 값이 0으로 될 경우, 어플리케이션은 종료되어도 안전하다고 여겨지기 때문에, 아무런 통지 없이, 혹은 이벤트가 프로세스에 전달되기도 전에 시스템에 의해 종료될 수 있다.

애플리케이션은 실행 전, info.plist에 특정한 키를 추가할 경우 '갑작스런 종료'기능을 활성화할 수 있다. 만약 NSSupportSuddenTermination키가 info.plist에 존재하고 그 값이 YES일 경우 이는 어플리케이션 실행 도중에 enableSuddenTermination을 호출한것과 같은 의미이며, 이는 애플리케이션이 '언제든 바로 종료될 수 있는' 상태로 만들어 준다. 반면 이 기능이 활성화 되어 있더라도 disableSuddenTermination을 호출함으로서 '갑작스런 종료'기능을 무력화 시킬 수 있다.

대부분의 경우, 애플리케이션이 종료되기 전에 반드시 실행이 완료되어야 하는 작업이 있을 경우, 개발자는 갑작스런 종료기능을 비활성화 하도록 할 것이다. 예를들어, 만약 애플리케이션이 '갑작스런 종료' 기능이 활성화 된 상태에서 디스크에 데이터를 기록하는 작업이 지연되는 경우에, disableSuddenTermination를 호출함으로서 작업을 보호한 후 필요한 작업을 진행하고, 그러고나서 enableSuddenTermination 메시지를 호출하는 구조를 취해야 할것이다..

애플리케이션 킷에 의존성이 없는 에이전트나 데몬과 같은경우, enableSuddenTermination을 언제든 호출하는것이 가능하다. 하지만 몇가지 어플리케이션 킷은 데이터 무결성을 위하여 '갑작스런 종료' 기능 자동으로 비활성화시켜 놓는다. 예를들자면, NSUserDefault와 NSDocument는 사용자의 입력 시점과 그 값이 디스크에 기록되는 시간 사이동안의 프로세스 종료를 방지하기 위하여 갑작스러운 종료기능을 비활성화 시켜놓는다.


/*  NSProcessInfo.h
    Copyright 1994-2002, Apple, Inc. All rights reserved.
*/


#include <Foundation/NSObject.h>

enum {  /* Constants returned by -operatingSystem */
    NSWindowsNTOperatingSystem = 1,
    NSWindows95OperatingSystem,
    NSSolarisOperatingSystem,
    NSHPUXOperatingSystem,
    NSMACHOperatingSystem,
    NSSunOSOperatingSystem,
    NSOSF1OperatingSystem
};

@class NSArray, NSString, NSDictionary;
@interface NSProcessInfo : NSObject {
    @private   
    NSDictionary    *environment;
    NSArray     *arguments;
    NSString        *hostName;    
    NSString        *name;
    void        *reserved;
}

+
(NSProcessInfo *)processInfo;
- (NSDictionary *)environment;
- (NSArray *)arguments;
- (NSString *)hostName;
- (NSString *)processName;
- (int)processIdentifier;
- (void)setProcessName:(NSString *)newName;
- (NSString *)globallyUniqueString;
- (unsigned int)operatingSystem;
- (NSString *)operatingSystemName;

#if MAC_OS_X_VERSION_10_2 <= MAC_OS_X_VERSION_MAX_ALLOWED
- (NSString *)operatingSystemVersionString; /* Human readable, localized; appropriate for displaying to user or using in bug emails and such; NOT appropriate for parsing */
#endif

@end



=====
아이폰 앱을 개발하고자 한 다짐이 든것이 어제. 그리고 오늘 그간 '왜 멀티태스킹이 되는 아이폰에서 작업관리자 프로그램이 없는거지'라는 생각에 프로세스에 대해서 찾아보다가 발견한 문서, Object-C도 처음이고 아이폰 코어가 어떻게 돌아가고 있는지도 모르는 상태였지만 대략 내용들을 훓어보니 이제 전체적인 구조가 눈에 들어오게 되었다. 탈옥이 되지 않은 폰상에서 돌아가는 앱을 만들기로 하여 API를 계속보는데 다른 프로세스 정보에 어떻게 접근해야하는지 전혀 나와있지 않다. 처음에는 다른 프로세스를 종료시킬 수 있는 방법에 대해 알아보려 했지만 선행조건 자체가 만족이 되지 않았으므로 아직은 보류. 단 AppSwitch라는 앱이 있는데 프로세스를 나열하고 전환시켜주는 멋진 프로그램이다. 단, 프로세스 종료는 안된다. 그리고 iStat은 백그라운드 프로세스도 보여준다고 한다. 어떻게 동작이 되는지 모르겠지만 결국 다른 앱을 구상해보기로 했다.


댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.