system函数实践1:system函数进程的爸爸是谁?

news2024/11/28 14:44:47

前言

有两个问题:

system函数中修改了环境变量,会不会影响执行它的进程?

       不会。

        首先,这个我测过了,因为我原本想用它来传递参数。

        为什么?因为system函数执行的时候,会先创建一个shell,然后再这个shell中执行命令,在一个正在shell中修改环境变量,会影响另一个正在运行的shell的环境变量吗?不会。

system函数执行命令实际上是创建一个进程,那么他的父进程是谁?

这个要分两种情况来考虑。下面使用实例解答。

一 简介

#include <stdlib.h>
int system(const char *command);

函数描述: 

DESCRIPTION
       The system() library function uses fork(2) to create a child process that executes the shell command specified in command using execl(3) as follows:

           execl("/bin/sh", "sh", "-c", command, (char *) 0);

       system() returns after the command has been completed.

       During  execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored, in the process that calls system() (these signals will be handled according to their defaults inside the child
       process that executes command).

       If command is NULL, then system() returns a status indicating whether a shell is available on the system

返回值:

 RETURN VALUE
       The return value of system() is one of the following:

       *  If command is NULL, then a nonzero value if a shell is available, or 0 if no shell is available.

       *  If a child process could not be created, or its status could not be retrieved, the return value is -1.

       *  If a shell could not be executed in the child process, then the return value is as though the child shell terminated by calling _exit(2) with the status 127.

       *  If all system calls succeed, then the return value is the termination status of the child shell used to execute command.  (The termination status of a shell is the termination status of the last command  it executes.)

       In the last two cases, the return value is a "wait status" that can be examined using the macros described in waitpid(2).  (i.e., WIFEXITED() WEXITSTATUS() and so on).

       system() does not affect the wait status of any other children.

二 实践 :

实践1:让system函数进程成为systemd的子进程

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    printf("pid=%d\n",getpid());
    system("sleep 100&");
    printf("ok\n");
    sleep(100);
    return 0;
}

测试:在后台执行a.out,进程号是64064,进程树导出到ps.txt文件

csdn@ubuntu:~$ ./a.out &
[1] 64064
csdn@ubuntu:~$ pid=64064
ok

csdn@ubuntu:~$ pstree -p > ps.txt
csdn@ubuntu:~$

 将进程树精简一下:如下所示system("sleep 100&");的进程号是64066,为什么不是64065,因为system函数的执行过程是,创建一个shell,然后再这个新shell中执行sleep。

未解?   

    这中间都发生了什么?它为什么会在a..out活着的时候,变成了别人的儿子?是道德的沦丧还是人性的扭曲?亦或是妈妈的改嫁?它为什么不是systemd的孙子?

        有一种相对较合理的解释,那就是sleep是在后台执行的。它的附近是sh,sh执行它时,sleep是后台执行,所示sh无需等他结束,sh自己结束了,但是sleep的父进程是sh,sleep没有父进程了,linux是不允许没有父进程的子进程的。所以sleep被systemd接管了。所以sleep变成了systemd的子进程。

csdn@ubuntu:~$ grep -A2 -E "grep|systemd|sleep|a.out" ps.txt
systemd(1)-+-NetworkManager(949)-+-dnsmasq(1117)
           |                     |-{gdbus}(1014)
           |                     `-{gmain}(1006)
--
           |-sleep(64066)
           |-smbd(1183)-+-smbd(1185)
           |            `-smbd(1193)
--
           |            `-sshd(60610)---sshd(60639)---bash(60640)---su(62226)---bash(62227)-+-a.out(64064)
           |                                                                                `-pstree(64074)
           |-systemd(2415)---(sd-pam)(2416)
           |-systemd-journal(385)
           |-systemd-logind(967)
           |-systemd-timesyn(671)---{sd-resolve}(684)
           |-systemd-udevd(411)
           |-udisksd(2841)-+-{cleanup}(2846)
           |               |-{gdbus}(2844)
csdn@ubuntu:~$

重新执行a.out&,然后使用 ps -l,这可以直接看到父进程的ID:如下所示,sleep进程的父进程ID是1。就是systemd。

csdn@ubuntu:~$ ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S  1004  62227  62226  0  80   0 -  6232 wait   pts/20   00:00:00 bash
0 S  1004  64102  62227  0  80   0 -  1088 hrtime pts/20   00:00:00 a.out
0 S  1004  64104      1  0  80   0 -  2257 hrtime pts/20   00:00:00 sleep
0 R  1004  64105  62227  0  80   0 -  7664 -      pts/20   00:00:00 ps
csdn@ubuntu:~$

实践 2:让system函数进程成为执行者的孙子进程

就是将system函数参数字符串后面的&去掉,修改前面的代码:

 //system("sleep 100&");
 system("sleep 100");

然后重新编译:运行,测试进程的PID是64129,sleep的父进程是sh,sh的父进程是a.out。

csdn@ubuntu:~$ ./a.out &
[1] 64129
csdn@ubuntu:~$ pid=64129

csdn@ubuntu:~$ ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S  1004  62227  62226  0  80   0 -  6232 wait   pts/20   00:00:00 bash
0 S  1004  64129  62227  0  80   0 -  1088 wait   pts/20   00:00:00 a.out
0 S  1004  64130  64129  0  80   0 -  1126 wait   pts/20   00:00:00 sh
0 S  1004  64131  64130  0  80   0 -  2257 hrtime pts/20   00:00:00 sleep
0 R  1004  64132  62227  0  80   0 -  7664 -      pts/20   00:00:00 ps
csdn@ubuntu:~$

查看进程树:


csdn@ubuntu:~$ pstree -p > ps.txt
csdn@ubuntu:~$
systemd(1)-+-NetworkManager(949)-+-dnsmasq(1117)
           |                     |-{gdbus}(1014)
           |                     `-{gmain}(1006)
--
           |            `-sshd(60610)---sshd(60639)---bash(60640)---su(62226)---bash(62227)-+-a.out(64129)---sh(64130)---sleep(6413+
           |                                                                                `-pstree(64140)
           |-systemd(2415)---(sd-pam)(2416)
           |-systemd-journal(385)
           |-systemd-logind(967)
           |-systemd-timesyn(671)---{sd-resolve}(684)
           |-systemd-udevd(411)
           |-udisksd(2841)-+-{cleanup}(2846)
           |               |-{gdbus}(2844)
csdn@ubuntu:~$

进程树截图。 

 小结

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

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

相关文章

自然灾害数据:中国台风数据集(更新至2022.3)

1、数据来源&#xff1a;中国天气网 2、时间跨度&#xff1a;1949-2021年 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; 包含指标如下&#xff1a; 序号、编号、中文名、登陆时间、登陆序号、登陆地、登陆地地区代码、登陆时强度等级、省份代码、省份、城市代码、…

高分英语Essay写作内容怎么介绍?

英国Essay的写作非常讲究逻辑思维&#xff0c;除此之外&#xff0c;单词、语法、标点符号这些细节也会影响Essay能否拿到高分。为了帮助大家写出质量高的英国Essay&#xff0c;接下来我们就详细介绍一下如何才能写出一篇高分英语Essay。 English Essay pays much attention to …

CISAW培训可以自学报名考试吗?

首先要跟大家说明的是&#xff0c;CISAW是强制培训的&#xff0c;并不可以通过自学而取得证书&#xff0c;也就是说你需要找一家CISAW认证的培训机构&#xff08;要选授权机构哦&#xff01;&#xff09;。众所周知&#xff0c;CISAW认证涉及了很多方向&#xff0c;那每个方向都…

centos系统下RabbitMQ安装教程

centos系统下RabbitMQ安装教程 我这里的环境用的腾讯云的轻应用环境 RabbitMQ是一个开源的遵循AMQP协议实现的基于Erlang语言编写&#xff0c;即需要先安装部署Erlang环境再安装RabbitMQ环境。需加注意的是&#xff0c;读者若不想跟着我的版本号下载安装&#xff0c;可根据两者…

Git 的内部工作原理

简介 通过本次分享学习 Git 的内部工作原理和实现方式。 学习这部分内容对于理解 Git 的用途和强大至关重要。 首先要弄明白一点&#xff0c;从根本上来讲 Git 是一个内容寻址&#xff08;content-addressable&#xff09;文件系统&#xff0c;并在此之上提供了一个版本控制…

WPF基础知识系例

WPF系列-绘图和动画1、WPF绘图1.1 直线1.2 矩形1.3 椭圆1.4 路径1、WPF绘图 这里将从静态图像绘制入手&#xff0c;进而学习动画效果制作。WPF 拥有自己的一套图形 API &#xff0c;使用这套 API 不但可以轻松地绘制出精美的图形&#xff0c;还可以方便地对图形进行滤镜、变形…

致敬逆行者网页设计作品 大学生抗疫感动专题网页设计作业模板 疫情感动人物静态HTML网页模板下载

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

RPC 对比 HTTP

初识RPC RPC 远程方法调用&#xff08;Remote Procedure Call&#xff09;大多用在服务治理领域 基本都是分布式环境中的注册中心来负责新服务的注册、服务续约、服务下线、服务销毁国内 Dubbo 是应用最广的 RPC 框架国外 gRPC RPC协议 无论哪种RPC方案&#xff0c;都要自定义…

你好,法语!A2知识点总结(3)

3.句型 3.1疑问 注意1 主谓倒装的疑问句式&#xff0c;主语必须是代词。 •主语是名词&#xff0c;不能直接倒装&#xff0c;要人为加进去一个代替主语的代词放在动词后面&#xff0c;“-”连接 •EX: Votre pre est professeur? •Est-votre pre professeur? •Votre pre e…

Kafka的设计原理

Kafka的设计原理和使用场景一、Kafka简介二、Kafka的架构2.1、Kafka 一些重要概念2.2、工作流程2.3、副本原理2.4、分区和主题的关系2.5、生产者2.5.1、分区可以水平扩展2.5.2、分区策略2.6、消费者2.6.1、消费方式2.6.2、分区分配策略2.7、数据可靠性保证2.7.1、副本数据同步策…

Linux基础知识

目录 流行的Linux发行版本 Linux系统的启动顺序 禁止使用ping命令 鉴定故障解决办法 user 不在 sudoers 文件中。此事将被报告解决办法 修改文件或目录的所属用户与权限 1、chgrp&#xff1a;更改文件属组 2、chown&#xff1a;更改文件属主&#xff0c;也可以同时更改文…

Agent 与对象的辨析

如果说对象是70年代以来软件界最激动人心的革新之一&#xff0c;那么&#xff0c;Agent的相关理论和技术&#xff0c;为分布式开放系统的设计与实现提供了新的途径&#xff0c;可以称之为软件开发的又一重大突破。讨论问题的前提是概念的澄清&#xff0c;什么是对象&#xff1f…

【学习笔记49】JavaScript的this指向

一、this指向 每一个函数内部都有一个关键字thisthis的值, 和函数的调用有关, 与函数书写无关 1. 普通调用方式 一个普通的全局函数, 在正常调用的情况下, this window function fn() {console.log(this); }fn() // this window2. 函数放置到对象 如果将函数放置到对象…

图数据技术护航网络安全 - Neo4j 大中华区总经理 方俊强

网络数字化及人工智能为许多行业来革命性的进步&#xff0c;但与此同时&#xff0c;网络安全领域产生的问题也日益严峻。人工智能进攻性风险和网络威胁领域的发展正在重新定义企业安全&#xff0c;从而给企业带来了更高的挑战。如何守护网络安全&#xff0c;成为企业深化数字化…

CSDN第十一场竞赛

目录 1.比赛详情 2.竞赛详情 3.原题回顾 (1).圆小艺 思路模拟 代码实现 (2). K皇把妹 思路模拟 代码实现 (3).筛选宝物 思路模拟 代码实现 (4).圆桌 思路模拟 代码实现 4.总结 1.比赛详情 报名地址&#xff1a;https://edu.csdn.net/contest/detail/24?utm_sou…

目标检测论文解读复现之二十:基于改进Yolov5的地铁隧道附属设施与衬砌表观病害检测方法

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0…

14个SpringBoot优化小妙招

1. 定义配置文件信息 有时候我们为了统一管理会把一些变量放到 yml 配置文件中 例如 用 ConfigurationProperties 代替 Value 使用方法 定义对应字段的实体 Data // 指定前缀 ConfigurationProperties(prefix "developer") Component public class DeveloperPro…

力扣(LeetCode)813. 最大平均值和的分组(C++)

动态规划 本题需要用到前缀和&#xff0c;前缀和需要将下标 iii 后移一位&#xff0c;所以我们将状态的下标 iii 也后移一位&#xff1b;由于状态转移依赖于 j−1j-1j−1 &#xff0c;我们将 jjj 的下标后移一位。 class Solution { public:double largestSumOfAverages(vecto…

2022天梯赛练习集(2022.9-2022.10)

使用函数判断完全平方数 没有加&#xff08;int&#xff09;过不了 int IsSquare(int n){if((int)sqrt(n) * sqrt(n) ! n) return 0;else return 1; } 使用函数求余弦函数的近似值 double funcos(double e, double x){double sum 1, item 1;for(int i 0; fabs(item) >…

Tmuxs -高效使用Linux terminal

Tmuxs -高效使用Linux terminal前言what&#xff1f;重要概念安装Tmux 常用命令Tmux 常用内部命令窗口&#xff08;window&#xff09;指令&#xff1a;面板&#xff08;pane&#xff09;指令&#xff1a;如何用鼠标调整pane大小配置生效参考配置参考前言 这个利器绝对可以提升…