0

SMJobSubmit() API を使用してデーモンをロードするプログラムを書きたいと思います。コードは次のとおりです。

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSString* myLabel = @"com.apple.mydaemon";

    AuthorizationItem authItem = { kSMRightBlessPrivilegedHelper, 0, NULL, 0 };
    AuthorizationRights authRights = { 1, &authItem };
    AuthorizationFlags flags = kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights;
    NSString *executablePath=@"/usr/libexec/mydaemon";
    AuthorizationRef auth;
    CFErrorRef error=0;
    if( AuthorizationCreate( &authRights, kAuthorizationEmptyEnvironment, flags, &auth ) == errAuthorizationSuccess ) {
        (void) SMJobRemove( kSMDomainSystemLaunchd, (CFStringRef)myLabel, auth, false, NULL );
        //NSLog( @"Authenticated install submit failed with error %@", error );

        NSMutableDictionary *plist = [NSMutableDictionary dictionary];
        NSMutableDictionary * programArgumnets=[NSMutableDictionary new];
        [programArgumnets setObject:executablePath forKey:@"item0"];
        [plist setObject:myLabel forKey:@"Label"];
        [plist setObject:programArgumnets forKey:@"ProgramArguments"];
        [plist setObject:[NSNumber numberWithBool:YES] forKey:@"RunAtLoad"];
        [plist setObject:[NSNumber numberWithBool:YES] forKey:@"KeepAlive"];

        if ( SMJobSubmit( kSMDomainUserLaunchd, (CFDictionaryRef)plist, auth, &error) ) {
            // Script is running
        } else {
            NSLog( @"Authenticated install submit failed with error %@", error );
        }
        if ( error ) {
            CFRelease( error );
        }

            (void) SMJobRemove( kSMDomainSystemLaunchd, (CFStringRef)myLabel, auth, false, NULL );
        AuthorizationFree( auth, 0 );
    }

    [pool drain];
    return 0;
}

しかし、それはこのエラーを与えます:

SMJobSubmit[822:707] 認証されたインストールの送信がエラー エラー Domain=kSMErrorDomainFramework Code=2051 で失敗しました。 NSDescription=launchd にロードするように指定されたジョブは無効でした。}

何が問題ですか ?前もって感謝します !

4

1 に答える 1

1

ProgramArguments を空にすることはできません。ProgramArguments 配列の最初の要素は、Program キーと同じである必要があります。詳細については、launchd のドキュメントと execvp のマニュアル ページを参照してください。

于 2013-04-17T23:57:09.543 に答える