【问题标题】:pthread_create b/w fork and execpthread_create b/w fork 和 exec
【发布时间】:2023-03-04 00:52:01
【问题描述】:

我希望在相应的子进程使用 exec 系统调用更改其映像之前,在子进程中创建一个线程。然而,看起来 pthread_create 调用被忽略了。

    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 调用,线程会执行。我在谷歌上搜索并在某个地方读到你不能在 fork 和 exec 之间使用 pthread_create,这与异步安全函数有关。你能帮忙吗?

【问题讨论】:

  • 每个进程都有自己的线程集和自己的地址空间。所以父母不会看到孩子创建的线程。
  • 我看到的一种可能的解决方案是在 fork 之前在父级中创建线程。还有其他可能的解决方法吗?
  • 是的,在父级中创建线程。同时创建一个pipe。让子进程在管道上写,父进程中的线程读取它。

标签: c++ linux pthreads exec fork


【解决方案1】:

exec 位会删除包括线程在内的所有内容,然后开始一个新进程。这包括内存等。

程序可能(并且通常)无法启动线程。

【讨论】:

  • 这是真的,但不要解释错误。线程特定于进程。请参阅我在问题中的评论。
  • 但是 exec 调用是在线程之后。技术上不应该创建线程然后执行 zapps 一切吗?
  • @BasileStarynkevitch - 我使用的是 KISS 原则。
  • 哦等等。所以即使线程是在 exec 系统调用之前创建的,新程序也会 zapp 吗?我该如何解决这个问题?
  • 我可以在fork之前在父级中创建线程。是否有任何其他可能的解决方法,让我从孩子创建线程并运行/维持它,即使在 exec 之后?
猜你喜欢
  • 2015-12-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2010-12-11
相关资源
最近更新 更多