在Linux和WinXP中,fork()和CreateProcess(带有所有必要的参数)是否是相同的东西?
如果它们不同,那么有人能解释一下在每种情况下会发生什么吗?
谢谢
在Linux和WinXP中,fork()和CreateProcess(带有所有必要的参数)是否是相同的东西?
如果它们不同,那么有人能解释一下在每种情况下会发生什么吗?
谢谢
CreateProcess
是仅适用于Windows的函数,而fork
则只能在POSIX(例如Linux和Mac OSX)系统上使用。
fork
系统调用创建一个新进程,并在父进程和子进程中从调用fork
函数的点继续执行。 CreateProcess
创建一个新进程并从磁盘加载程序。唯一相似之处是最终结果是创建了一个新进程。CreateProcess
和 fork
的各自手册页面。
CreateProcess
与fork()
和exec()
函数的组合类似。CreateProcess 进行以下步骤:
Unix 的 fork 进行以下步骤:
总的来说,程序通常读取的比写入要多得多,通常子/父进程只需要对其堆栈进行写入,而这只是他们程序块的一小部分。
此外Unix fork不同之处在于返回两次,一次在父进程中(其子进程的进程ID),一次在子进程中(0,恭喜你成为新的子进程),这是我们在代码中区分自己是子进程还是父进程的方式。fork()
:#include "stdio.h"
#include "stdlib.h"
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int fac(int);
int main(void)
{
int child_ret,input_num=-1;
pid_t pid1;
while(input_num<0){
printf("\nPlease input a non-negative number: ");
scanf("%d",&input_num);
}
if((pid1=fork())<0){
printf("fork error");
}
else if(pid1==0){
printf("\nI am the child process,my PID is %d.\n\nThe first %d numbers of fibonacci sequence is:\n", getpid(),input_num);
for (int i=0;i<input_num;i++)
{printf("%d\n", fac(i+1));}
}
else{
wait(&child_ret);
printf("\nI am the parent process,my PID is %d.\n\n", getpid());
}
return 0;
}
int fac(int n)
{
if (n<=2) return n-1;
else
{
return fac(n-1)+fac(n-2);
}
}
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _tmain( VOID )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
LPTSTR szCmdline=_tcsdup(TEXT("MyChildProcess"));
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
szCmdline, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d)./n", GetLastError() );
return;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
fork() + exec()
视为 CreateProcess()
。实际上,fork()
更类似于 Windows 中的 CreateThread()
。