gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:19:57 24 4
gpt4 key购买 nike

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

谁能解释一下,windows中的线程和进程是否有映射到Linux中的线程和进程?

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

如果相同,我在 Windows 中有 CreateThread() 和 CreateProcess() 调用,在 linux 中有哪些等效调用?

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

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

最佳答案

好吧,在 Linux 中有针对您的目的的等效调用,但它们的工作方式略有不同,至少对于进程机制而言。

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

  2. 模拟 CreateProcess 以启动外部进程并不是那么简单。您将需要著名的 fork/exec 组合。首先,您需要在主进程中调用 fork 以生成子进程。这个 child 是通过复制初始过程创建的。然后,您可以通过检查 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 对 child 来说是 0,对 parent 来说 child 的 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调用的程序结束后,当前进程也结束了,你不希望主进程出现这种情况。

关于c - Linux/Windows 上的线程/进程比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9782050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com