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

news2024/11/25 8:15:07

目录

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

父子进程共享

        读时共享,写时复制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/873180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一休休的面试题

重点面试题(今天又看了很多的博客大概有个三十来篇吧所以总结了一休休的面试题)&#xff1a; ps:已经入秋了为什么还是这么热&#xff01;&#xff01;&#xff01; 1、受管 bean 的生命周期 对于普通的 Java 对象&#xff0c;new 的时候会去创建对象&#xff0c;而当它没有…

Redis进阶(3)——在Linux上基于Docker容器Redis搭建一主二从三哨兵 SpringBoot整合Redis哨兵

目录 引出redis主从搭建&#xff1a;一主2从6389Master准备文件redis.confredis.log日志文件运行容器查看日志方式tail 6390Slave6391Slave 创建3哨兵创建文件夹sentinel创建运行哨兵容器问题&#xff1a;脑裂问题 SpringBoot整合Redis哨兵启动1主2从&#xff0c;3哨兵pom.xml文…

聊聊服务端缓存那些事(预热、淘汰、污染、雪崩、穿透、击穿等)

文章目录 概要一、缓存预热二、缓存污染2.1、先更新数据库再更新缓存2.2、先更新缓存再更新数据库2.3、先删除缓存再更新数据库&#xff0c;读时再更新2.4、先更新数据库再删除缓存&#xff0c;读时再更新2.5、缓存污染总结2.6、删除缓存失败了怎么办&#xff1f;2.7、延迟双删…

【数据结构与算法】十大经典排序算法-堆排序

&#x1f31f;个人博客&#xff1a;www.hellocode.top &#x1f3f0;Java知识导航&#xff1a;Java-Navigate &#x1f525;CSDN&#xff1a;HelloCode. &#x1f31e;知乎&#xff1a;HelloCode &#x1f334;掘金&#xff1a;HelloCode ⚡如有问题&#xff0c;欢迎指正&#…

JZ33二叉搜索树的后序遍历序列

题目地址&#xff1a;二叉搜索树的后序遍历序列_牛客题霸_牛客网 题目回顾&#xff1a; 解题思路&#xff1a; 使用栈 栈的特点是&#xff1a;先进后出。 通读题目后&#xff0c;我们可以得出&#xff0c;二叉搜索树是左子节点小于根节点&#xff0c;右子节点大于根节点。 …

wps设置一键标题字体和大小

参考 wps设置一键标题字体和大小&#xff1a;https://www.kafan.cn/A/7v5le1op3g.html 统一一键设置

[FPGA IP系列] 2分钟了解FPGA中的BRAM

FPGA设计中&#xff0c;BRAM是一项非常关键的内置存储资源&#xff0c;FPGA开发需要熟练使用BRAM&#xff0c;今天再复习一下BRAM的知识&#xff0c;包括BRAM的定义、组成、应用等等。 一、BRAM介绍 1、BRAM的定义 RAM是Random Access Memory&#xff0c;也就是随机访问数据…

C字符串练习题(6.3.1)

编写一个程序&#xff0c;从键盘上读入一个小于1000的正整数&#xff0c;然后创建并输出一个字符串&#xff0c;说明该整数的值。例如&#xff0c;输入941&#xff0c;程序产生的字符串是“Nine hundred and forty one”。 #include<stdlib.h> #include<string.h>…

【STM32】FreeRTOS互斥量学习

互斥量&#xff08;Mutex&#xff09; 互斥量又称互斥信号量&#xff08;本质也是一种信号量&#xff0c;不具备传递数据功能&#xff09;&#xff0c;是一种特殊的二值信号量&#xff0c;它和信号量不同的是&#xff0c;它支持互斥量所有权、递归访问以及防止优先级翻转的特性…

Spring Boot 项目实现 Spring AOP

【注】实现在SpringBoot项目中&#xff0c;同时给两个类的方法添加AOP前置通知 1、创建一个SpringBoot项目 2、创建两个目标类和方法 package com.tqazy.learn_spring_project.spring_aop;import org.springframework.stereotype.Service;/*** ClassName SpringAopUserServi…

【树状数组优化哈希DP】CF1801 C

Problem - C - Codeforces 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define lowbit(x) (x & (-x))using i64 long long;constexpr int N 2e5 10; constexpr int mod 1e9 7;std::vector<int> V[N];int n, m, x, mxv 0; int a[N], id[N…

MySQL入门学习教程(一)

mysql简介 1、什么是数据库 &#xff1f; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库&#xff0c;它产生于距今六十多年前&#xff0c;随着信息技术和市场的发展&#xff0c;特别是二十世纪九十年代以后&#xff0c;数据管理不再仅仅…

学习笔记整理-JS-02-基本类型

文章目录 一、数据类型简介和检测1. JavaScript中两大数据类型 二、基本数据类型1. 数字类型2. 字符串类型3. 布尔类型4. undefined类型5. null 三、数据类型的转换1. 数据类型的转换 四、重点内容 一、数据类型简介和检测 1. JavaScript中两大数据类型 基本数据类型 Number S…

Android学习之路(3) 布局

线性布局LinearLayout 前几个小节的例程中&#xff0c;XML文件用到了LinearLayout布局&#xff0c;它的学名为线性布局。顾名思义&#xff0c;线性布局 像是用一根线把它的内部视图串起来&#xff0c;故而内部视图之间的排列顺序是固定的&#xff0c;要么从左到右排列&#xf…

最强自动化测试框架Playwright(22)-模拟器

可以使用测试生成器通过仿真生成测试&#xff0c;以便为特定窗口、设备、配色方案生成测试&#xff0c;以及模拟地理位置、语言或时区。测试生成器还可以生成测试&#xff0c;同时保留经过身份验证的状态。 模拟视口大小 Playwright 打开一个浏览器窗口&#xff0c;其视口设置…

电路基础之电容

电容器&#xff08;Capacitor&#xff09;是由两个导体电极之间夹着一个电介质而组成的元件。这两个电极可以是金属板、箔片、涂层等&#xff0c;而电介质则是放置在电极之间的绝缘材料。电容器的基本构成包括以下几个要素&#xff1a; 电极&#xff1a;电容器的电极是两个导体…

无涯教程-Perl - readpipe函数

描述 该函数将EXPR作为命令执行。然后,将输出作为标量文本中的多行字符串返回,或者将行作为列表context中的单个元素返回。 语法 以下是此函数的简单语法- readpipe EXPR返回值 此函数在标量context中返回String,在列表context中返回List。 例 以下是显示其基本用法的示…

HTML详解连载(6)

HTML详解连载&#xff08;6&#xff09; 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽CSS特性继承性注意 层叠性特点 优先级规则公式注意 叠加计算公式&#xff08;每以及之间不存在进位&#xff09;规则 Emmet写法分析属性名属性值注意 背景图平铺方式属性…

【分布式存储】数据存储和检索~B+树

为什么数据存储结构重要 在存储系统中&#xff0c;其实不管数据是什么样的&#xff0c;归根结底其实都还是取决于数据的底层存储结构&#xff0c;而主要常见的就是数据库索引结构&#xff0c;B树、Redis中跳表、以及LSM、搜索引擎中的倒排索引。本质都是如何利用不用的数据结构…