目录
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、返回值、各自的父进程、进程创建的时间、闹钟、未决信号集。
父子进程共享
读时共享,写时复制。