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

时间:2012-03-20 06:03:25

标签: c windows linux multithreading process

我在Windows中使用线程和进程方面有一些经验。

有人可能会解释一下,Linux中的线程和进程是否可能与Linux中的相同?

这意味着,Windows中的线程= Linux中的线程? - >有道理吗?             Windows中的进程= Linus中的进程? - >有道理吗?

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

我已经阅读过SO中的一些帖子,但大多数帖子都没有解除我的疑虑。所以想开始新的帖子。

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

1 个答案:

答案 0 :(得分:6)

嗯,Linux中有相同的调用目的,但它们的工作方式略有不同,至少对于流程机制而言。

  1. 对于线程,您可以使用pthread_create。除了一些参数不同之外,它的工作方式与CreateThread非常相似。应该很容易使用。这是一个很好的教程:https://computing.llnl.gov/tutorials/pthreads/

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

  3. 返回的值来控制流量
     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
     }
    

    基本上rv对于孩子来说是0,对于父母来说是孩子的pid。我希望到目前为止我没有失去你。 :)

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

     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
     }
    

    在上面的例子中,我启动了/bin/ls外部进程,它打印了当前文件夹的内容。

    以下是一个简单的完整示例:http://flinflon.brandonu.ca/dueck/2001/62306/Processes/Unix%20Examples.htm

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