C Linux/Windows上的线程/进程比较

C Linux/Windows上的线程/进程比较,c,windows,linux,multithreading,process,C,Windows,Linux,Multithreading,Process,我有一些在Windows中使用线程和进程的经验 请有人解释一下,windows中的线程和进程是否有可能映射到Linux中的相同线程和进程 也就是说,Windows中的线程==Linux中的线程?->有道理吗? Windows中的进程==Linux中的进程?->有道理吗 如果相同,我在windows中有CreateThread()和CreateProcess()调用,那么linux中的等效调用是什么 我在SO上读过一些帖子,但大多数都没有消除我的疑虑。所以我想开始一篇新的帖子 如果我能通过一些简单

我有一些在Windows中使用线程和进程的经验

请有人解释一下,windows中的线程和进程是否有可能映射到Linux中的相同线程和进程

也就是说,Windows中的线程==Linux中的线程?->有道理吗? Windows中的进程==Linux中的进程?->有道理吗

如果相同,我在windows中有CreateThread()和CreateProcess()调用,那么linux中的等效调用是什么

我在SO上读过一些帖子,但大多数都没有消除我的疑虑。所以我想开始一篇新的帖子


如果我能通过一些简单的例子(C编程)得到一些解释,那就太好了。

好吧,在Linux中,对于您的目的有一些相同的调用,但它们的工作原理有点不同,至少对于进程机制是这样的

  • 对于线程,可以使用
    pthread\u create
    。它的工作方式与
    CreateThread
    非常相似,只是有些参数不同。应该很容易使用。这里有一个很好的教程:

  • 模拟
    CreateProcess
    以启动外部流程并不是那么简单。您将需要著名的
    fork/exec
    组合。首先,需要在主进程内调用
    fork
    ,以生成子进程。此子进程是通过复制初始进程创建的。然后,您可以通过检查
    fork
    返回的值来控制流:

  • 基本上,
    rv
    对于子对象为0,对于父对象为子对象的pid。我希望到目前为止我没有失去你

    继续,您需要调用
    exec
    函数系列中的一个函数来启动外部进程:

    在上面的示例中,我正在启动
    /bin/ls
    外部进程,该进程将打印当前文件夹的内容

    下面是一个简单的完整示例:


    现在,您可能想知道为什么首先需要调用
    fork
    ,为什么
    execl
    还不够。这是因为
    execl
    调用的程序终止后,当前进程也会终止,您不希望在主进程中发生这种情况。

    在Linux中查找and调用。不要期望Linux和Windows系统调用之间存在等价性。概念和术语略有不同。严格来说,Linux根本没有线程,它只知道进程,最近还知道共享地址空间和/或文件描述符的进程。而且,它从不创建新流程,它只会复制这些流程。到目前为止,即使可以获得类似或相同的最终结果,在东西的工作方式上也没有真正的1:1对应关系。注意:不可能在返回fork()后立即启动新进程。我的意思是,如果我们可以将可执行文件作为fork的一部分传递给派生,我们不需要执行fork()后的下一行,这和windows中的createProcess一样符合逻辑吗?@Renjith G:恐怕不行<代码>分叉不接受任何参数。它的唯一目的是将当前流程复制到新流程中
    fork/exec
    是linux启动外部进程的标准方式。很酷,所以新的fork进程有一个新的PID正确吗?子进程和父进程中的线程ID相同吗?我还假设linux中的线程编程比进程编程更受欢迎,不是吗?这就是我在线程编程中看到的比其他线程编程更多的输入。现代Linux支持的线程编程更接近于
    CreateProcess()
     int rv = fork(); 
     // new process was spawned here. The following code is executed 
     // by both processes.
     if(rv == 0)
     {
         // we are in the child process
     }
     else
     {
         // we are in the parent
     }
    
     int rv = fork(); 
     // new process was spawned here. The following code is executed 
     // by both processes.
     if(rv == 0)
     {
         execl("/bin/ls", "ls", NULL); // start the ls process
     }
     else
     {
         // we are in the parent
     }