目录
echo
PATH
SHELL
TERM
LANG
HOME
env
fork
返回值
getpid
getppid
测试代码1
测试结果
测试代码2
测试结果
父子进程相同
父子进程不同
父子进程共享
echo
查看单个环境变量。
PATH
可执行文件的搜索路径。
SHELL
当前Shell。
TERM
当前终端类型。终端类型决定了一些程序的输出显示方式。
LANG
语言和 ocale,决定了字符编码以及时间、货币等信息的显示格式。
HOME
当前用户主目录的路径。
echo $PATH
echo $TERM
echo $LANG
echo $HOME
echo $SHELL
env
打印全部的环境变量。
env
fork
创建一个子进程。
man 2 fork
返回值
失败:-1
成功:
父进程返回子进程的ID。
子进程返回0。
getpid
获取当前进程ID。
man 2 getpid
getppid
man 2 getppid
测试代码1
创建子进程,并输出进程ID。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
printf("程序开始运行!\n");
printf("当前进程的ID是%d。\n", getpid());
printf("开始创建进程!\n");
pid_t jin_cheng = fork();
printf("创建进程完成!\n");
if (jin_cheng < 0)
{
perror("创建进程错误!");
}
else if (jin_cheng == 0)
{
printf("这是子进程,当前进程的ID是%d,父进程ID是%d。\n", getpid(), getppid());
printf("子进程程序结束1!\n");
printf("子进程程序结束2!\n");
}
else if (jin_cheng > 0)
{
printf("这是父进程,当前进程的ID是%d,父进程ID是%d,子进程的ID是%d。\n", getpid(), getppid(), jin_cheng);
printf("父程序结束1!\n");
sleep(2); //系统程序运行较快,增加延时查看程序并行运行的效果
printf("父程序结束2!\n");
}
return 0;
}
测试结果
测试代码2
利用父进程创建多个子进程。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
int i;
printf("程序开始运行!\n");
printf("当前进程的ID是%d。\n", getpid());
printf("开始创建进程!\n");
for (i = 0; i < 5; i++)
{
if (fork() == 0) //子进程,不参与创建进程
{
break;
}
}
if (i == 5)
{
sleep(5); //延时,最后输出父进程
printf("这是父进程,当前进程的ID是%d。\n", getpid());
}
else
{
sleep(i); //延时i秒,按顺序输出
printf("这是第%d个子进程,当前进程的ID是%d。\n", i + 1, getpid());
}
return 0;
}
测试结果
父子进程相同
在刚调用fork函数结束后,父子进程相同的内容:data段、text段、堆、栈、环境变量、全局变量、宿主目录位置、进程工作目录位置、信号处理方式。同时,父进程先执行还是子进程先执行不确定。取决于内核所使用的调度算法。
父子进程不同
父子进程不同的内容为:进程ID、返回值、各自的父进程、进程创建的时间、闹钟、未决信号集。
父子进程共享
读时共享,写时复制。