创建一个子进程,以及一个全局变量。子进程修改全局变量,然后每隔 1 秒打印全局变量的值和当前进程的 PID,执行 10 次后退出;主进程等待子进程运行完成,最后打印出全局变量的值和当前进程的 PID。
时间: 2024-02-03 18:11:35 浏览: 89
以下是 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 秒。
相关问题
1.利用fork创建子进程,验证局部变量、全局变量和malloc动态申请的变量在父子进程中的使用情况。
当使用fork创建子进程时,子进程会复制父进程的所有变量和内存空间。因此,局部变量和全局变量在父子进程中的使用情况是不同的。在父进程中修改局部变量的值不会影响子进程中的值,但是修改全局变量的值会影响到子进程中的值。对于malloc动态申请的变量,父子进程都会拥有一个指向同一块内存空间的指针,因此在父进程中修改malloc动态申请的变量的值也会影响到子进程中的值。
写一个脚本文件,并赋予它可执行权限,然后分别在当前进程以及子进程中执行这个脚本程序。要求该脚本程序打印当前进程号,并验证已经在Shell中定义了的本地和全局变量的作用域范围。
### 回答1:
以下是一个实现上述要求的shell脚本,其中使用了两个变量`$local_var`和`$global_var`来测试作用域范围。
```
#!/bin/bash
echo "当前进程号: $$"
echo "全局变量global_var值为: $global_var"
if [ -n "$local_var" ]; then
echo "本地变量local_var已经定义, 值为: $local_var"
else
echo "本地变量local_var未定义"
fi
```
在命令行中,首先需要将脚本文件保存为`test.sh`并赋予可执行权限:
```
$ chmod +x test.sh
```
然后,可以在当前进程中直接执行该脚本文件:
```
$ ./test.sh
```
输出结果为:
```
当前进程号: 1234 #这里显示当前进程号
全局变量global_var值为:
本地变量local_var未定义
```
然后,可以在子进程中执行该脚本文件,使用`source`命令来保证脚本文件在当前进程中执行:
```
$ source ./test.sh
```
输出结果为:
```
当前进程号: 1234 #这里显示当前进程号
全局变量global_var值为: global_value #这里显示定义的全局变量的值
本地变量local_var未定义
```
可以看到,当在子进程中执行脚本文件时,可以读取到在Shell中定义的全局变量`$global_var`的值,但是无法读取到本地变量`$local_var`的值,这表明了本地变量的作用域仅限于其所在的Shell进程中。
### 回答2:
这里给出一个示例的Shell脚本文件:
```shell
#!/bin/bash
# 打印当前进程号
echo "当前进程号是:$$"
# 打印本地变量的作用域范围
local_var="我是本地变量"
echo "在当前进程中,本地变量local_var的值为:$local_var"
# 打印全局变量的作用域范围
echo "在当前进程中,全局变量global_var的值为:$global_var"
# 在子进程中执行脚本程序
./script.sh
```
为了给脚本文件赋予可执行权限,可以使用以下命令:
```shell
chmod +x script.sh
```
然后在当前进程中执行该脚本程序,可以使用以下命令:
```shell
./script.sh
```
执行结果会打印当前进程号,以及本地变量和全局变量的值。
在Shell中定义了的本地变量的作用域范围是当前进程。这意味着本地变量只能在当前进程中访问和使用,其他进程无法访问。
而全局变量的作用域范围更广,可以在所有子进程中访问和使用。全局变量可以在Shell中定义,并且可以在进程内的其他脚本中访问和使用。在上面的示例脚本中,并未给全局变量赋值,所以其值为空。如果在Shell中定义了全局变量global_var,那么在子进程中执行脚本时,可以访问和使用这个变量。
### 回答3:
要写一个能运行在当前进程以及子进程中的脚本程序,可以使用Shell脚本语言编写一个脚本文件,并为其赋予可执行权限。
首先,创建一个名为"script.sh"的脚本文件,其中的内容如下:
```bash
#!/bin/bash
# 打印当前进程号
echo "当前进程号:$$"
# 验证本地变量作用域范围
local_var="我是局部变量"
echo "局部变量的值:$local_var"
# 验证全局变量作用域范围
echo "全局变量的值:$global_var"
```
接着,使用chmod命令为脚本文件赋予可执行权限:
```bash
chmod +x script.sh
```
现在我们可以在当前进程中执行这个脚本程序,只需要在终端里运行以下命令:
```bash
./script.sh
```
该脚本程序将打印出当前进程号,并验证本地变量以及全局变量的作用域范围。
接下来,为了在子进程中运行脚本程序,可以使用bash命令来启动一个新的子shell并在其中执行脚本文件。命令如下:
```bash
bash script.sh
```
这将在一个新的子shell中执行脚本程序,并打印出子进程的进程号,同时验证本地变量以及全局变量的作用域范围。
总之,通过编写一个脚本文件并为其赋予可执行权限,我们可以在当前进程以及子进程中执行这个脚本程序,并验证本地和全局变量的作用域范围。
阅读全文