2016-10-28 3 views
1

저는 스레드, 프로세스, execv 등에 매우 익숙합니다. 저는 조사한 결과, execv를 실행할 때 호출 프로세스의 공간이 필요하다는 것을 알았습니다. main에서 쓰레드를 생성 한 다음 execv를 쓰레드 (쓰레드가 생성되기 직전이 아니라 쓰레드가 생성 된 직후)를 호출 할 때 어떻게되는지 궁금하다. 나는 execv가 main을 대체 할 것이지만 이것이 스레드를 대체 할 것이거나 스레드가 정상적으로 실행되고 완료 될 수 있다는 것을 의미 하는가?스레드를 만든 후 execv를 호출하십시오.

작은 예를 들어 내가 부탁 해요 :

int main(){ 
     printf("hello from main!); 
     char *buffer = "some data"; 

    if(pthread_creat(&mythreadpid, NULL, thread1, buffer){ 
     printf("ERROR!!"); 
    } 

    execv(...) //do execv here 

} 

void *thread1(void *buffer){ 
    printf("calling from my thread!"); 

//do something else 

} 

나는이 테스트 한 내 thread와 경험 이상한 행동 내가이 그것을

에 대한 이유가 있는지 알고 싶어 너무 완료되지 것 않았다
+0

'execv'는 단 하나의 스레드가 아니라 전체 프로세스를 대체합니다. – Barmar

+0

그래서 메인과 메인에서 생성 된 스레드를 대체할까요? – unconditionalcoder

+0

예, 환경 및 열린 파일 설명자를 제외하고 현재 프로세스의 모든 메모리와 상태가 exec에 의해 덮어 쓰여집니다. – Barmar

답변

3

모든 exec 기능은 전체 프로세스를 실행중인 프로그램으로 바꿉니다. 모든 쓰레드가 파괴된다.

현재 프로세스에 영향을주지 않고 다른 프로그램을 실행하려면 fork()을 먼저 사용하여 새 프로세스를 만들고 하위 프로세스에서 execv()을 호출해야합니다. fork()을 멀티 스레드 프로그램에서 사용할 때주의해야 할 점은 Is it safe to fork from within a thread?을 참조하십시오.

+0

단순한 환경보다 훨씬 더 많은 상태이며 열린 파일 기술자는 exec를 통해 유지 관리됩니다. 현재 작업 디렉토리; 무시 된 신호 및 신호 마스크의 처분; umask; ptrace state ... – caf

+0

@caf 고마워, 나는 내가 세부 사항을 놓치고 있다고 느꼈다. 나는이 질문에 정말로 중요하지 않기 때문에 그것을 삭제했다. – Barmar

+0

@caf, 질문에 대한 다른 주석에서 환경 **이 ** exec ** (2) 호출에서 ** 지정되었으므로이 또한 대체되었습니다. 환경은 프로세스의 가상 공간에 저장되며 프로세스 가상 주소 공간에 저장되지 않는 열린 디스크립터와 같은 리소스 만 보존됩니다. 새로운 환경을 요구하지 않는 호출은 새로운'exec * (2)'호출에 매개 변수로받은 환경만을 사용합니다. * O_CLOEXEC 플래그가없는 열린 디스크립터 만 보존됩니다. 그것을 가지고있는 것들은 닫힐 것이다. 또한 모든'mmap (2)'세그먼트를 잃어버린다. –

관련 문제