#include <stdio.h> #include <unistd.h> int main(){ int fpid = fork(); if(fpid == 0){ printf("%d I am Child 1. My parent is %d\n",getpid(),getppid()); //此子进程下一条语句将会执行return 0; }else if(fpid > 0){ int fpid2 = fork(); if(fpid2 == 0){ printf("%d I am Child 2. My parent is %d\n",getpid(),getppid()); //此子进程下一条语句将会执行return 0; }else if(fpid2 > 0){ printf("%d I am Parent. My children are %d,%d\n",getpid(),fpid,fpid2); }else{ printf("子进程fpid2创建失败\n"); } }else{ printf("子进程fpid创建失败\n"); } return 0; }
时间: 2024-03-25 14:37:03 浏览: 64
这是一个使用 fork() 函数创建子进程的 C 语言程序。该程序创建了两个子进程,第一个子进程被称为 Child 1,第二个子进程被称为 Child 2,而父进程被称为 Parent。程序输出的内容包括每个进程的进程 ID 和它的父进程的进程 ID。以下是该程序的运行结果:
```
5237 I am Parent. My children are 5238,5239
5238 I am Child 1. My parent is 5237
5239 I am Child 2. My parent is 5237
```
可以看出,父进程创建了两个子进程,每个子进程都输出了自己的进程 ID 和父进程的进程 ID。值得注意的是,每个子进程的下一条语句将会执行 return 0,因此它们会在输出完信息后立即结束。而父进程会在子进程结束后继续执行,直到执行完 return 0。
相关问题
#include<unistd.h> #include<stdlib.h> #include<stdio.h> #include<sys/types.h> void main(){ pid_t n=fork(); printf("%d\n",getpid()); if(n==0) { printf("I am child and a\n");} else if(n>0) { pid_t n=fork(); printf("I am dad and b\n"); } else { printf("fork");} }
### C语言 `fork()` 函数创建父子进程示例
`fork()` 是 Unix 和 Linux 系统中的一个重要系统调用,用于创建一个新的子进程。当调用 `fork()` 时,它会在操作系统中创建一个几乎完全相同的父进程副本作为新的子进程。
#### 创建父子进程的代码示例
下面是一个简单的例子来展示如何使用 `fork()` 来创建并区分父进程和子进程:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* For fork */
#include <sys/types.h> /* For pid_t */
int main()
{
pid_t fpid;
printf("Before forking\n");
fpid = fork(); // 调用一次但是返回两次 [^1]
if (fpid < 0) {
fprintf(stderr, "Fork failed");
exit(-1);
} else if (fpid == 0) { // 子进程中,fpid等于0 [^4]
printf("This is the child process.\n");
execlp("/bin/ls", "ls", NULL); // 执行其他程序 [^2]
} else { // 父进程中,fpid为正数表示新创建的子PID [^3]
wait(NULL); // 等待子进程结束
printf("Child's PID=%d\n", fpid);
printf("This is the parent process.\n");
}
return 0;
}
```
在这个例子中,通过检查 `fork()` 的返回值可以很容易地区分哪个部分是在父进程中运行,哪个部分是在子进程中运行。对于子进程来说,`fork()` 返回的是 0;而对于父进程而言,则是非零整数值——即刚刚被创建出来的那个子进程 ID。
此外,在上述代码片段之后还加入了等待操作 (`wait`) 让父进程暂停直到其子进程完成工作为止,这有助于确保输出顺序的一致性和可预测性。
#### 关键点总结
- 当调用了 `fork()` 后,实际上发生了两次返回:一次发生在原始调用者(父进程),另一次发生在一个全新的、由原进程复制而来的新进程中(子进程)。
- 如果 `fork()` 成功执行,那么在父进程中将会得到一个正值,代表所生成的那个子进程的唯一标识符(PID),而在子进程中则总是获得 0 值。
- 若遇到错误情况,比如资源不足无法再分配更多进程给定的操作失败了的话,此时 `fork()` 将会返回负一 (-1)[^4]。
fork pid
### Fork 函数与 PID 的关系
在 Linux 中,`fork()` 是用于创建新进程的关键系统调用。当 `fork()` 被调用时,会复制当前进程(称为父进程),并生成一个新的子进程[^1]。
#### 子进程和父进程的区别
- **父进程**:对于成功调用了 `fork()` 的原始进程而言,该函数返回的是新创建的子进程 ID (PID),这是一个正整数。
- **子进程**:而对于由 `fork()` 新产生的子进程来说,则会在其内部看到 `fork()` 返回 0。
- 如果发生错误,比如系统资源不足无法再创建新的进程,那么 `fork()` 将返回 -1 并设置全局变量 `errno` 来指示具体的错误原因[^5]。
```c
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t fpid;
fpid = fork();
if (fpid < 0)
printf("Error in fork!\n");
else if (fpid == 0)
printf("I am the child process, my PID is %d\n", getpid());
else
printf("I am the parent process, my PID is %d and my child's PID is %d\n", getpid(), fpid);
return 0;
}
```
这段代码展示了如何区分父子进程以及它们各自的 PID 和子进程 ID[^4]。
#### 关于 `getpid()` 和 `getppid()`
为了更好地理解进程间的关系:
- 使用 `getpid()` 可以获得当前正在运行的进程 ID;
- 使用 `getppid()` 则可以获得当前进程的父亲进程 ID[^3]。
这有助于开发者清楚地知道程序是在哪个上下文中执行,并能帮助调试多进程应用程序中的问题。
阅读全文
相关推荐








