Linux/Windows线程/进程比较

5

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

请问,是否可以将Windows中的线程和进程映射到Linux中呢?

也就是说,Windows中的线程 == Linux中的线程? -> 有任何意义吗? Windows中的进程 == Linux中的进程? -> 有任何意义吗?

如果相同,我在Windows中有CreateThread()和CreateProcess()函数调用,那么在Linux中有什么等效的调用吗?

我已经阅读了一些SO上的帖子,但大多数都没有解决我的疑惑。所以想发起一个新帖子。

如果能提供一些简单的例子(C编程),并作出一些解释,那就太好了。


2
在Linux中查找pthread_createfork调用。 - Some programmer dude
1
不要期望Linux和Windows系统调用之间存在等价性。概念和术语略有不同。 - Basile Starynkevitch
严格来说,Linux根本没有线程,它只知道进程,而且最近还有共享地址空间和/或文件描述符的进程。此外,它从不创建新进程,只会复制它们。因此,即使可以实现类似或相同的最终结果,但在工作方式上并没有真正的一对一对应关系。 - Damon
1个回答

6

嗯,在Linux中,你的目标有相应的调用方法,但它们的工作方式略有不同,至少对于进程机制来说是这样。

  1. 对于线程,您可以使用pthread_create。它的工作方式非常类似于CreateThread,只是某些参数不同。使用起来非常容易。这里有一个很好的教程:https://computing.llnl.gov/tutorials/pthreads/

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

 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,而对于父进程而言,rv 的值则会是子进程的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调用的程序终止后,当前进程也将被终止,而你不希望主进程也被终止。

@Renjith G:恐怕不行。fork不需要任何参数。它的唯一目的是将当前进程复制到一个新进程中。fork/exec是启动外部进程的标准Linux方式。 - Tudor
很酷,所以新的分叉进程有一个新的PID对吧?子进程和父进程中的线程ID是相同的吗? - Renjith G
我认为在Linux中,线程编程比进程编程更受欢迎,不是吗?这就是我看到更多有关线程编程的输入而不是其他内容的原因。 - Renjith G
酷,意味着进程和线程以所谓的“任务”形式存在于调度程序中? - Renjith G
1
现代Linux支持posix_spawn()函数,它更接近于CreateProcess() - caf
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接