linux中创建进程是直接的,就是简单的一个fork调用,linux认为进程就是执行的一个任务,并没有和可执行文件联系起来,如果非要和可执行文件 联系的话就要涉及到另一个系统调用exec.linux这么实现取得了很大的灵活性,这个灵活性实际上也是继承unix的,因为unix就是这样实现进程的,进程在unix或者类unix比如linux系统中就是一个执行续,而不是别的什么特殊的东西,这使得在这些系统中很容易就实现了线程的概念,而且可 以用统一的管理系统去管理线程或者进程,所不同的仅仅是进程拥有另外一些东西而线程却没有,线程成了进程的完全子集,这在设计上是很重要的.相 反,windows内核虽然完全实现了线程,但是它实现的线程却和进程的概念是完全分离的,唯一的相同点就是都是nt执行体的"可执行"对象,统一于对象 管理器,继承了可执行对象的一切特性.这样windows实现的现代进程和线程的概念就相当松散,不利于统一管理,这完全体现在用户接口上,我们看一下 windows的进程创建接口;
BOOL CreateProcess
(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes。
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
这 里仅仅给出接口声明和简单的解释,更详细的请查阅MSDN,第一个参数是可执行模块的名称字符串,第二个是命令行,...就不多说了,看得晕吗?我是不喜 欢这种方式了,为什么进程一定要有可执行模块?去问微软吧!这也可能是微软的策略,故意让你进入他自己的开发模式,然后上瘾然后你就离不开微软了...; 再看一眼它的线程创建接口:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
BOOL CreateProcess
(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes。
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
这 里仅仅给出接口声明和简单的解释,更详细的请查阅MSDN,第一个参数是可执行模块的名称字符串,第二个是命令行,...就不多说了,看得晕吗?我是不喜 欢这种方式了,为什么进程一定要有可执行模块?去问微软吧!这也可能是微软的策略,故意让你进入他自己的开发模式,然后上瘾然后你就离不开微软了...; 再看一眼它的线程创建接口:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273438