프로세스를 포킹하여 특정 줄의 코드를 먹는 것 같습니다 - Objective -C

StackOverflow https://stackoverflow.com/questions/1817351

문제

내 코드의 단순화 된 버전은 다음과 같습니다.

- (IBAction)convert:(id)sender
{
    /* these two lines are ignored */
    [textbox setStringValue:@"converting"];
    [convertButton setEnabled:NO];

        pid_t pid;
        if((pid=fork())==-1)
        {
            [log setStringValue:@"couldn't fork a new process."];
            converting = 0;
        [convertButton setEnabled:YES];
            return;
        }else if (pid==0)
        {
            //this is the child
            sleep(2);
            exit(0);
        }else{
            int status;
            waitpid(pid,&status,0);
        }
    }
}

꽤 기본적인 포크 () 호출입니다. 문제는, 맨 위에있는 두 줄 (주석으로 표시)은 무시된다는 것입니다. ~ 후에 포크 아이가 종료됩니다. 왜요?

편집하다: 그리고 그것을 고치려면 어떻게해야합니까?

도움이 되었습니까?

해결책

너 정말 진짜 진짜 전화하고 싶지 않습니다 fork() 코코아 응용 프로그램에서. 마하 포트 및 기타 시스템 바인딩 인프라와 같은 다양한 자원이 fork() 경계. 실은 모든 종류의 지옥을 유발합니다.

사용 NSTask 대신에. 효과적으로 만듭니다 fork()/exec() 내부적으로, 올바르게 수행되도록 상당한주의를 기울여야합니다.

다른 팁

아마도 GUI가 상태를 변경하기 전에 코드가 메인 이벤트 루프로 돌아와야하기 때문에? 또는 코드가 커널 수준 대기 ()를 수행하는 동안 GUI를 실행하는 스레드가 차단 되었기 때문에 약간의 변형이 있습니까?

BBUM은 이것을 정확하게 얻었습니다. 다음은 내가 사용한 코드입니다.

- (IBAction)convert:(id)sender
{
    task = [[NSTask alloc] init];
    [task setLaunchPath: @"/usr/local/bin/lame"];

    NSArray *arguments;
    arguments = [NSArray arrayWithObjects: file,outputFile, nil];
    [task setArguments: arguments];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskFinished:) name:NSTaskDidTerminateNotification object:task];

    [task launch];  
}
- (void) taskFinished:(NSNotification *)note {
    // code here executes after process finishes    
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top