2013-03-30 3 views
0

각 자식 프로세스가 exec 시스템 호출을 사용하여 이미지를 변경하기 전에 자식 프로세스에 스레드를 만들고 싶습니다. 그러나, pthread_create 호출은 간과되고있는 것 같습니다.pthread_create b/w fork 및 exec

pthread_t thread; 
    pthread_attr_t attribute; 

    pthread_attr_init(&attribute); 
    pthread_attr_setdetachstate(&attribute, PTHREAD_CREATE_DETACHED); 

pid_t cid = fork(); 

if(cid == 0)  //CHILD Process 
{ 
    switch(x->option) 
    { 
     case 1:  pthread_create(&thread, &attribute, compressShow, NULL);     
        execl("/home/aamir/Lab/ass3/compression", "compression", source, destination, NULL); 
        cout<<"Execution failed."<<endl; break; //This segment will execute if exec fails. 
    } 

else   //PARENT Process 
{ 
    wait(0);  //Prevents termination of original main until forked exec completes execution 
    pthread_cancel(thread); 
} 

스레드는 기본적으로 '.'을 출력하기위한 진보 디스플레이입니다. (점들)은 갈래 모양의 아이와 일치한다.

exec 호출을 제거하면 스레드가 실행됩니다. 나는 Google에서 검색 한 후 async safe 함수와 관련이있는 fork와 exec 사이에서 pthread_create를 사용할 수 없다는 것을 읽을 수 있습니다. 좀 도와 줄 수있어?

+0

각 프로세스는 정의에 따라 자체 스레드 세트와 자체 주소 공간을 가지고 있습니다. 따라서 부모는 자식이 만든 스레드를 보지 못합니다. –

+0

내가 볼 수있는 가능한 해결책 중 하나는 포크가 있기 전에 부모에 스레드를 만드는 것입니다. 주변에 다른 가능한 작업이 있습니까? –

+0

예, 상위에 스레드를 만듭니다. 또한'pipe'를 생성하십시오. 자식이 파이프에 글을 쓰게하고, 부모 스레드가 파이프를 읽게하십시오. –

답변

2

exec 비트는 스레드를 포함한 모든 항목을 zapp하고 새로운 프로세스를 시작합니다. 메모리 등을 포함합니다.

프로그램은 스레드를 시작하는 비트에 도달하지 않을 수 있습니다.

+1

이것은 사실이지만 실수를 설명하지는 않습니다. 스레드는 프로세스에 고유합니다. 질문에서 내 의견을 참조하십시오. –

+0

하지만 exec 호출은 스레드 이후입니다. 기술적으로 스레드를 생성하지 말고 exec가 모든 것을 zapps해야합니까? –

+0

@BasileStarynkevitch - KISS 원칙을 사용하고있었습니다. –