创建进程是操作系统提供的重要功能,允许程序启动新的执行线程。根据不同的操作系统,创建进程的系统调用主要有以下两种方式:
一、Linux/Unix系统中的创建进程系统调用
fork() - 用于创建与父进程几乎完全相同的子进程,包括代码段、数据段、堆栈等内存空间,但子进程拥有独立的文件描述符和进程ID。
- 子进程从父进程的`main`函数继续执行,而父进程执行`fork()`后的代码。
clone()
- 提供更灵活的进程创建方式,允许指定新进程的属性(如内存区域、信号处理等)。
二、Windows系统中的创建进程系统调用
CreateProcess()
功能更全面,支持创建新进程并指定其运行环境(如安全属性、环境变量等)。
三、其他相关说明
进程创建时机: 系统初始化时(如Linux的`init`进程)或用户程序通过系统调用请求时都会创建进程。 进程关系
四、示例代码
Linux系统(使用fork):
```c
include include int main() { pid_t pid = fork(); if (pid == 0) { // 子进程 printf("子进程PID: %d\n", getpid()); } else if (pid > 0) { // 父进程 printf("父进程PID: %d, 子进程PID: %d\n", getpid(), pid); wait(NULL); // 等待子进程结束 } else { perror("fork失败"); return 1; } return 0; } ``` Windows系统(使用CreateProcess): ```c include include int main() { STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; char *cmdline = "notepad.exe"; BOOL success = CreateProcess(NULL, cmdline, // 命令行参数 NULL, // 进程句柄不可继承 NULL, // 线程句柄不可继承 FALSE, // 继承句柄 0, // 无创建标志 NULL, // 使用父进程环境 NULL, // 使用父进程当前目录 &si,// 指向STARTUPINFO结构 &pi)// 指向PROCESS_INFORMATION结构 ); if (!success) { printf("CreateProcess失败: %d\n", GetLastError()); return 1; } printf("子进程PID: %d\n", pi.dwProcessId); WaitForSingleObject(pi.hProcess, INFINITE); // 等待子进程结束 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; } ``` 通过以上系统调用,程序可以实现多任务处理和并发执行。