【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

env

打印全部的环境变量。

env

fork

创建一个子进程。

man 2 fork

 

返回值

失败:-1

成功:

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

  2. 子进程返回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、返回值、各自的父进程、进程创建的时间、闹钟、未决信号集。

父子进程共享

        读时共享,写时复制。

猜你喜欢

转载自blog.csdn.net/CETET/article/details/132266898
今日推荐