【Linux系统编程】21.echo、env、fork、getpid、getppid

目录

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

【Linux系统编程】21.echo、env、fork、getpid、getppid_第1张图片

env

打印全部的环境变量。

env

fork

创建一个子进程。

man 2 fork

【Linux系统编程】21.echo、env、fork、getpid、getppid_第2张图片 

返回值

失败:-1

成功:

  1. 父进程返回子进程的ID。

  2. 子进程返回0。

getpid

获取当前进程ID。

man 2 getpid

【Linux系统编程】21.echo、env、fork、getpid、getppid_第3张图片

getppid

man 2 getppid

【Linux系统编程】21.echo、env、fork、getpid、getppid_第4张图片

测试代码1

创建子进程,并输出进程ID。

#include 
#include 
#include 
#include 

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;
}

测试结果

【Linux系统编程】21.echo、env、fork、getpid、getppid_第5张图片

测试代码2

利用父进程创建多个子进程。

#include 
#include 
#include 
#include 

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;
}

测试结果

【Linux系统编程】21.echo、env、fork、getpid、getppid_第6张图片

父子进程相同

        在刚调用fork函数结束后,父子进程相同的内容:data段、text段、堆、栈、环境变量、全局变量、宿主目录位置、进程工作目录位置、信号处理方式。同时,父进程先执行还是子进程先执行不确定。取决于内核所使用的调度算法。

父子进程不同

        父子进程不同的内容为:进程ID、返回值、各自的父进程、进程创建的时间、闹钟、未决信号集。

父子进程共享

        读时共享,写时复制。

你可能感兴趣的:(Linux系统编程,linux,嵌入式硬件,ubuntu,c语言,c++)