我在Windows中使用线程和进程方面有一些经验。
有人可能会解释一下,Linux中的线程和进程是否可能与Linux中的相同?
这意味着,Windows中的线程= Linux中的线程? - >有道理吗? Windows中的进程= Linus中的进程? - >有道理吗?
如果相同,我在windows中有CreateThread()和CreateProcess()调用,linux中的等价调用是什么?
我已经阅读过SO中的一些帖子,但大多数帖子都没有解除我的疑虑。所以想开始新的帖子。
如果我通过一些简单的例子(C编程)得到一些解释,那就太好了。
答案 0 :(得分:6)
嗯,Linux中有相同的调用目的,但它们的工作方式略有不同,至少对于流程机制而言。
对于线程,您可以使用pthread_create
。除了一些参数不同之外,它的工作方式与CreateThread
非常相似。应该很容易使用。这是一个很好的教程:https://computing.llnl.gov/tutorials/pthreads/
模拟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,对于父母来说是孩子的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
调用的程序终止后,当前进程也会终止,并且您不希望在主进程中发生这种情况。