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