编写一段程序,使用系统调用fork( )创建一个子进程,在子进程中显示该子进程及其父进程的PID,然后子进程睡眠10秒钟(使用系统调用sleep(10));父进程通过调用wait( )等待子进程结束,并显示该子进程的PID。
时间: 2023-05-24 09:06:09 浏览: 64
```c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
pid = fork(); // 创建子进程
if (pid < 0) // 创建子进程失败
{
fprintf(stderr, "Error: fork() failed.\n");
exit(1);
}
else if (pid == 0) // 子进程
{
printf("子进程PID:%d,父进程PID:%d\n", getpid(), getppid()); // 显示子进程和父进程的PID
sleep(10); // 子进程睡眠10秒钟
exit(0); // 子进程结束
}
else // 父进程
{
int status;
wait(&status); // 父进程通过wait()等待子进程结束
printf("子进程PID:%d 已结束\n", pid); // 显示子进程的PID
}
return 0;
}
```
相关问题
编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程并发执行,观察实验结果并分析原因。
以下是一个使用 `fork()` 系统调用创建两个子进程的程序示例:
```c
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid1, pid2;
pid1 = fork();
if (pid1 == 0) {
printf("Child process 1, pid=%d\n", getpid());
} else if (pid1 > 0) {
pid2 = fork();
if (pid2 == 0) {
printf("Child process 2, pid=%d\n", getpid());
} else if (pid2 > 0) {
printf("Parent process, pid=%d\n", getpid());
} else {
fprintf(stderr, "Error: fork() failed\n");
return 1;
}
} else {
fprintf(stderr, "Error: fork() failed\n");
return 1;
}
return 0;
}
```
在该程序中,首先使用 `fork()` 创建了一个子进程 `pid1`,然后在父进程中再次调用 `fork()` 创建了另一个子进程 `pid2`。这样,就有一个父进程和两个子进程并发执行了。
运行该程序,可以得到类似如下的输出:
```
Parent process, pid=1234
Child process 1, pid=1235
Child process 2, pid=1236
```
可以看到,首先输出了父进程的信息,然后输出了两个子进程的信息。
在程序中,第一次调用 `fork()` 创建了一个子进程,该子进程复制了父进程的地址空间、代码段、数据段和堆栈等资源,并将其保存在一个新的进程中,同时返回一个新的进程 ID(即子进程的 ID),以区分父进程和子进程。在子进程中,由于 `pid1` 的值为 0,所以输出了对应的信息。
接着,在父进程中再次调用 `fork()` 创建了另一个子进程 `pid2`。与第一次调用 `fork()` 类似,该子进程也复制了父进程的地址空间、代码段、数据段和堆栈等资源,并将其保存在一个新的进程中,同时返回一个新的进程 ID(即子进程的 ID),以区分父进程和子进程。在子进程中,由于 `pid2` 的值为 0,所以输出了对应的信息。
由于父进程在两次调用 `fork()` 后并未执行任何其他操作,因此父进程本身并没有输出信息。但是,由于父进程创建了两个子进程,因此在输出信息时会将所有三个进程的信息一起输出。
用C语言编写一段源程序,使用fork()系统调用创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。观察进程活动结果,分析原因。
好的,我能理解您的要求。答案如下:
利用 C 语言编写的程序可以使用 fork() 系统调用创建新进程。这个系统调用会在当前代码段的位置创建一个新的进程,该进程会复制原始进程的所有状态,包括程序计数器和所有寄存器的值。在成功创建子进程后,fork() 会返回一个值,这个值为 0(新创建的子进程)或是一个正整数(新的父进程)。原始进程的进程 ID(PID)和父进程 ID (PPID)也被计入到新的子进程中。使用 fork() 调用可以创建两个子进程。每个新的子进程会有自己的 PID,而父进程仍将保留原始 PID。
下面是这样一段源程序的实现:
```
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid1, pid2;
pid1 = fork();
pid2 = fork();
if (pid1 == 0 && pid2 > 0) {
printf("Child process1, PID = %d\n", getpid());
printf("Parent process, PID = %d\n", getppid());
} else if (pid1 > 0 && pid2 == 0) {
printf("Child process2, PID = %d\n", getpid());
printf("Parent process, PID = %d\n", getppid());
} else if (pid1 > 0 && pid2 > 0) {
printf("Parent process, PID = %d\n", getpid());
} else {
printf("Error: fork() failed!\n");
}
return 0;
}
```
这段程序使用 fork() 调用创建了两个子进程。当程序运行时,会生成一个父进程和两个子进程。每个子进程都会输出自己的进程 ID 以及父进程的 ID。结果如下:
```
Parent process, PID = 1000
Child process1, PID = 1001
Parent process, PID = 1000
Child process2, PID = 1002
Parent process, PID = 1
```
可以看到,当进程活动时,三个进程都运行了相同的源代码。父进程在一个子进程创建后也使用 fork() 创建了另一个子进程。这就解释了为什么会有两个子进程。每个进程都有自己的 PID 和 PPID。子进程1的 PPID 为父进程的 PID,其 PID 为 1001。子进程2的 PPID 为父进程的 PID,其 PID 为 1002。父进程的 PPID 为 1,这是由于 init 进程是所有进程的祖先进程,当父进程的父进程(Shell)退出时,它会变成 init 进程的子进程。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)