功能: 创建三个子进程, 每个子进程打印十次自己的pid,每隔1秒打印一次 父进程打印自己的ID和返回的子进程ID 父进程必须等所有子进程都打印完后才能结束退出
时间: 2023-03-21 19:03:11 浏览: 168
下面是一个Python程序实现了这个功能:
```python
import os
import time
# 创建三个子进程
for i in range(3):
pid = os.fork()
if pid == 0:
# 子进程
for j in range(10):
print(f"Child process {os.getpid()} is running")
time.sleep(1)
exit(0)
# 等待所有子进程结束
for i in range(3):
pid, status = os.wait()
print(f"Child process {pid} terminated with status {status}")
# 父进程
print(f"Parent process {os.getpid()} is running")
```
这个程序使用 `os.fork()` 创建了三个子进程,并在每个子进程中打印了 10 次进程 ID。父进程等待所有子进程都结束后,再打印自己的进程 ID。使用 `os.wait()` 函数等待子进程结束,该函数会阻塞直到任一子进程结束,并返回结束的子进程 ID 和状态信息。由于有三个子进程,因此要调用三次 `os.wait()`。
相关问题
在父进程中创建一个子进程。 父进程:打印自己和子进程的 pid,打印当前工作目录,休眠 5 秒,再打印当前工作目录。 子进程:打印父进程和自己的 pid,打印当前工作目录,切换当前工作目录,再打印当前工作目录。 对照输出结果,解释一下为什么会是这样。
在C语言中,你可以使用`fork()`系统调用来创建一个新的子进程。下面是一个简单的示例,演示父进程和子进程如何操作:
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#define MAX_PATH_LENGTH 100
int main() {
int pid = fork(); // 创建子进程
if (pid == 0) { // 如果这是子进程
printf("子进程PID: %d, 当前工作目录: %s\n", getppid(), getcwd(NULL, MAX_PATH_LENGTH));
printf("我是子进程,父进程PID: %d, 当前工作目录: %s\n", getpid(), getcwd(NULL, MAX_PATH_LENGTH));
chdir("/"); // 切换到根目录
printf("子进程新的工作目录: %s\n", getcwd(NULL, MAX_PATH_LENGTH));
} else if (pid > 0) { // 如果这是父进程
printf("父进程PID: %d, 子进程PID: %d, 当前工作目录: %s\n", getpid(), pid, getcwd(NULL, MAX_PATH_LENGTH));
sleep(5); // 休眠5秒
printf("父进程结束休眠,当前工作目录: %s\n", getcwd(NULL, MAX_PATH_LENGTH));
} else { // fork失败
perror("Fork failed");
exit(EXIT_FAILURE);
}
return 0;
}
```
当你运行此程序时,你会看到以下输出:
1. 父进程会首先打印自己的PID和当前工作目录,然后休眠5秒,再次打印工作目录。这是因为父进程在创建子进程后立即开始执行,而子进程会在父进程休眠期间运行。
2. 子进程则在父进程休眠之前打印出自己的PID、父进程的PID以及初始的工作目录。接着,它切换到根目录(`chdir("/")`),并打印新工作目录。由于这是在父进程休眠期间完成的,所以父进程不会看到子进程切换后的目录。
总结起来,父子进程的行为独立,互不影响。父进程在子进程执行期间保持原状态,而子进程有自己的生命周期和变化。
创建一个子进程,以及一个全局变量。子进程修改全局变量,然后每隔 1 秒打印全局变量的值和当前进程的 PID,执行 10 次后退出;主进程等待子进程运行完成,最后打印出全局变量的值和当前进程的 PID。
以下是 Python 代码实现:
```python
import os
import time
global_var = 0
def child_process():
global global_var
for i in range(10):
global_var += 1
print("Child process: global_var =", global_var, "PID =", os.getpid())
time.sleep(1)
if __name__ == '__main__':
pid = os.fork()
if pid == 0:
child_process()
else:
os.wait()
print("Parent process: global_var =", global_var, "PID =", os.getpid())
```
代码说明:
- `os.fork()` 函数可以创建一个子进程,返回值为 0 代表子进程,非 0 代表父进程。
- `os.wait()` 函数可以等待子进程结束,保证主进程在子进程结束后再继续执行。
- `os.getpid()` 函数可以获取当前进程的 PID。
- `time.sleep(1)` 函数可以让程序暂停 1 秒。
阅读全文