2013-03-30 43 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上搜索过,并在某处读过你不能在fork和exec之间使用pthread_create,这与异步安全函数有关。你能帮忙吗?

+0

每个进程都有自己的一组线程和自己的地址空间。所以父母不会看到孩子创建的线程。 –

+0

我看到的一种可能的解决方案是在fork之前在父级创建线程。有没有其他可能的解决方法? –

+0

是的,在父级创建线程。另外创建一个'pipe'。让孩子在管道上书写,并在父母的线程读取它。 –

回答

2

该exec位zapps包括线程的一切,只是开始一个新的过程。这包括内存等。

该程序可能(并且通常)没有得到该位来启动线程。

+1

这是真的,但不要解释错误。线程特定于进程。看到我在问题中的评论。 –

+0

但是exec调用是在线程之后。在技​​术上不应该创建线程,然后exec zapps的一切? –

+0

@BasileStarynkevitch - 我正在使用KISS原则。 –