Linux-----进程(fork+exec)

 执行一个新程序 fork + exec 

 exec  
  #include <unistd.h>

       extern char **environ;
       int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
       int execle(const char *path, const char *arg0, ... /*,(char *)0, char *const envp[]*/);
       int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);
      
       int execv(const char *path, char *const argv[]);
       int execve(const char *path, char *const argv[], char *const envp[]);
       int execvp(const char *file, char *const argv[]);
       int execvpe(const char *file, char *const argv[],char *const envp[]);

进程的 image  = 进程的组成部分(text|data|bss|堆栈)
int execl(const char *path, const char *arg0, ... /*, (char *)0 */);
int execv(const char *path, char *const argv[]);
功能:
   执行一个新的程序 
 
l 和 v 
list     //列举  --- 后面的参数逐个列举出来 
vector   //向量  --- 后面的参数 以字符串指针数组的形式组织 

参数:
  @path   //说明 --要执行的可执行文件的名字 (包含路径)   
  @arg0   //执行文件的名字 
  ...     //可变参数
          //看要执行的文件 是否有需要的参数 
          //形式 字符串形式 最终 以 NULL作为结尾    

 ls -l /
  execl("/bin/ls","ls","-l","/",NULL); 
  char *const arg[] = {"ls","-l","/",NULL};
  execv("/bin/ls",arg); 

  bash
     |
   fork()
   /   \ 
 bash  bash (+exec 函数调用 --- 它会用新程序的镜像替换原有镜像,
            名字也变了,父子关系没变)

 int execlp(const char *file, const char *arg0, ... /*, (char *)0 */);
 int execvp(const char *file, char *const argv[]);
 p 表示 要执行的文件 到系统的环境变量PATH中区寻找

ls -l / 
execl("/bin/ls","ls","-l","/",NULL); 
execlp("ls", "ls","-l","/",NULL);

char *const arg[] = {"ls","-l","/",NULL};
  execvp("ls",arg); 

int execle(const char *path, const char *arg0, ... /*,(char *)0, char *const envp[]*/);
 int execve(const char *path, char *const argv[], char *const envp[]);
 
 e --- environment 
 应用:
    有些程序 ,运行时,需要获得环境变量 (系统的 或者 自定义)

#include<stdio.h>
#include<unistd.h>
extern char **environ;
int main(int argc, const char *argv[])
{
	char * const envp[]	= {"USER=linux","PSWD=12345",NULL};
	//execle("./myenv","myenv",NULL,environ);
	//execle("./myenv","myenv",NULL,envp);
	
	char * const arg[] = {"myenv",NULL};
	execve("./myenv",arg,envp);

	return 0;
}

strtok()    
    
     char *strtok(char *str, const char *delim);
     功能:
         分割字符串 
     参数:
        str  表示要分割的字符串  //如果填写NULL 表示接着原来的字符串继续分割 
        delim 表示分割标志 
     返回值:
        成功 返回分割出来的字符串地址
        失败 返回NULL
    
    char *arg[] = {"ls","-l","/",NULL};
    execvp(arg[0],arg);
 

#include<stdio.h>
#include<string.h>

int main(int argc, const char *argv[])
{
	
	char buf[] = "ls;-l;/:";
	int len = strlen(buf);

	char *arg[20] = {NULL};

	arg[0] = strtok(buf,";:");

	int i = 0;

	while(arg[++i] = strtok(NULL,";:"));

	for(i=0;i<10;++i)
	{
		printf("arg[%d] = %s\n",i,arg[i]);
//		printf("%s",arg[]);
	}
	return 0;
}

wait() 

pid_t wait(int *wstatus);
功能:
   等待子进程状态改变 
   (主要用来 --- 回收子进程的资源----避免僵尸态)
参数:
    wstatus      NULL  //表示不关心子进程退出时 状态信息 
                不是NULL //想关心子进程退出状态信息
返回值:
   成功 返回结束了的子进程的pid号 
   失败  -1
说明:
  1.wait ---阻塞操作 
  2.如果没有任何子进程,wait调用失败 --提示 NO child process 

3.子进程退出时,
    对应的退出状态值,需要使用相关的宏来获取
    WIFEXITED  //判断是否正常结束 
      WEXITSTATUS  //获取对应的退出状态值 
    WIFSIGNALED  //判断是否被信号结束 
      WTERMSIG     //获得信号的编号 
 

#include<stdio.h>

int main(int argc, const char *argv[])
{
	if (pid < 0)
	{
		perror("fork fail");
		return -1;
	}

	if (pid>0)
	{
		while(1)
		{
			printf("father%d\n",getpid());
			if(wait(NULL)<0)
			{
				perror("wait fail");
			}
			sleep(1);
		}
	}else if(pid == 0)
	{

	}
	return 0;
}

wait()放在函数内。

//waitpid
pid_t waitpid(pid_t pid, int *wstatus, int options);

The value of pid can be:

       < -1   meaning wait for any child process whose process group ID is equal to the absolute value of pid.
                eg:
                  pid = -100
                  进程组 id = |-100| = 100 

       -1     meaning wait for any child process.
              eg:
                 pid = -1 
                 等待所有子进程 ---当前进程的所有进程 

       0      meaning wait for any child process whose process group ID is equal to that of the calling process.
              eg:
                 等待 进程组id = PPID 的进程组中的所有子进程 

       > 0    meaning wait for the child whose process ID is equal to the value of pid.
              eg:
               pid = 100 
                   等待 pid 为100的子进程状态改变
       
    options:
        WNOHANG  以非阻塞的方式 回收子进程  ---1. 如果是非阻塞 ,在没有子进程状态改变时,此时返回0 
                                               2. 必须配合循环使用 (轮询)
        0        表示阻塞 


waitpid //灵活  + 提供了非阻塞的使用方式

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL_优化

1 SQL优化 (1) 数据读取 ①分区裁剪:使用时只读取需要的分区. ②列裁剪:读取操作(select、where、join、group by、sort by等),不读取不需要的列,减少IO消耗. (2) 数据筛选 ①分区先过滤,区分度大的字段先过滤. ②不在筛选字段上使用函数和表达式. (3) 分组聚合 ①使用窗口函数…

centos9之ESXi环境下安装

一、centos9简介 CentOS Stream 9是一个基于RHEL&#xff08;Red Hat Enterprise Linux&#xff09;的开源操作系统。它是CentOS Stream系列的最新版本。CentOS Stream是一个中间发行版&#xff0c;位于RHEL和Fedora之间&#xff0c;旨在提供更及时的软件更新和新功能。CentOS …

Vue2+Element实现Excel文件上传下载预览【超详细图解】

目录 一、需求背景 二、落地实现 1.文件上传 图片示例 HTML代码 业务代码 2.文件下载 图片示例 方式一&#xff1a;代码 方式二&#xff1a;代码 3.文件预览 图片示例 方式一&#xff1a;代码 方式二&#xff1a;代码 一、需求背景 在一个愉快的年后&#xff…

在线会议时, 笔记本电脑的麦克风收音效果差是为什么

背景 最近在线面试. 使用腾讯会议或者飞书, 戴耳机参加在线面试, 遇到好几个面试官说我的音质不好. 一直没在意, 后来反思, 应该是电脑哪里出了问题. 排查 先买了一副品牌有线耳机, 测试后本地录制的声音仍然品质很差去掉耳机延长线后, 麦克风品质仍然很差最终找到答案, 原…

【十二】Golang 映射

&#x1f4a2;欢迎来到张胤尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 映射映射的定义映射初始化make 函数使用字面量 源…

【HarmonyOS Next】鸿蒙TaskPool和Worker详解 (一)

【HarmonyOS Next】鸿蒙TaskPool和Worker详解 &#xff08;一&#xff09; 一、TaskPool和Worker如何实现多线程&#xff1f;各自特点是什么&#xff1f; 在鸿蒙中通过TaskPool和Worker实现多线程并发&#xff0c;两者都基于Actor并发模型实现。 Actor并发模型&#xff0c;每…

FFmpeg.NET:.NET 平台上的音视频处理利器

FFmpeg.NET 是一个封装了 FFmpeg 功能的 .NET 库&#xff0c;能够方便地在 C# 项目中处理音视频文件。它支持多种操作&#xff0c;包括转码、剪辑、合并、分离音频等。 功能 解析元数据从视频生成缩略图使用以下参数将音频和视频转码为其他格式&#xff1a; 码率&#xff08;…

计算机网络————(一)HTTP讲解

基础内容分类 从TCP/IP协议栈为依托&#xff0c;由上至下、从应用层到基础设施介绍协议。 1.应用层&#xff1a; HTTP/1.1 Websocket HTTP/2.0 2.应用层的安全基础设施 LTS/SSL 3.传输层 TCP 4.网络层及数据链路层 IP层和以太网 HTTP协议 网络页面形成基本 流程&#xff1a…

源码压缩包泄露

##解题思路 因为网站的文件都放在www下面&#xff0c;所以直接访问/www.zip就可以得到网页的源码压缩包 在fl000g.txt这个文件中看到一个flag{flag_here}不像是真的flag&#xff0c;尝试提交ctfshow{flag_here}&#xff0c;果然提交失败 打开文件属性之类的&#xff0c;也没有…

组态软件在物联网中的应用

随着物联网的快速发展&#xff0c;组态软件在物联网中的应用也越来越广泛。组态软件是一种用于创建和管理物联网系统的可视化工具&#xff0c;它能够将传感器、设备和网络连接起来&#xff0c;实现数据的采集、分析和可视化。本文将探讨组态软件在物联网中的应用&#xff0c;并…

Java+SpringBoot+Vue+数据可视化的音乐推荐与可视化平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在互联网技术以日新月异之势迅猛发展的浪潮下&#xff0c;5G 通信技术的普及、云计算能力…

(论文)PartialSpoof 数据库和检测话语中嵌入的短假语音片段的对策

The PartialSpoof Database and Countermeasures for the Detection of Short Fake Speech Segments Embedded in an Utterance 摘要 自动说话人验证容易受到各种作和欺骗&#xff0c;例如文本到语音合成、语音转换、重放、篡改、对抗性攻击等。我们考虑一种称为“部分欺骗”…

Leaflet介绍及使用示例

一、Leaflet介绍 Leaflet是一个开源的JavaScript库&#xff0c;专门用于构建交互式的地图应用程序。它以其轻量级、高性能和易于使用的API而著称&#xff0c;方便开发者在网页中集成地图功能。Leaflet支持多种地图提供商的瓦片图层&#xff0c;如OpenStreetMap、Mapbox等&…

【笔记】redis回忆录(未完 重头过一遍)

了解 redis在linux上运行 没有window版本 有也是微软自己搞的 &#xff08;一&#xff09;安装与修改配置 1.在linux虚拟机上 安装gcc依赖 然后再usr/local/src解压在官网下载好的redis安装包 直接拖进去 tar -zxvf 安装包名字 tab键补齐 解压成功 进入软件 并执行编译命令…

使用 Apache Dubbo 释放 DeepSeek R1 的全部潜力

作者&#xff1a;陈子康&#xff0c;Apache Dubbo Contributor 2025年1月20日&#xff0c;国产大模型公司深度求索&#xff08;DeepSeek&#xff09;正式发布了大语言模型 DeepSeek-R1&#xff0c;并同步开源其模型权重。通过大规模强化学习技术&#xff0c;DeepSeek-R1 显著提…

Unity TMPro显示中文字体

TMP默认的字体只能显示英语&#xff0c;那么怎么显示中文呢 1、找到支持中文的字体文件 在c盘搜索Fonts文件夹有很多支持中文的字体文件 我这里选择雅黑 PS.双击打开发现里面有粗体细体普通三个版本&#xff0c;也可以只导入一个版本进去 2、将其拖入到unity Assets里面 3…

【MySQL篇】数据库基础

目录 1&#xff0c;什么是数据库&#xff1f; 2&#xff0c;主流数据库 3&#xff0c;MySQL介绍 1&#xff0c;MySQL架构 2&#xff0c;SQL分类 3&#xff0c;MySQL存储引擎 1&#xff0c;什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xf…

Linux 日志系统·

目录 一、前言 二、实现一个简单的日志 1.可变参数 2.日志等级 3.日志时间 4.打印每一条参数 5.合并两个缓冲区 6.封装日志函数 三、完整代码 一、前言 当我们写一个函数&#xff0c;例如打开文件open&#xff0c;当我们打开失败的时候&#xff0c;会调用perror看到错误…

【PromptCoder】使用 package.json 生成 cursorrules

【PromptCoder】使用 package.json 生成 cursorrules 在当今快节奏的开发世界中&#xff0c;效率和准确性至关重要。开发者们不断寻找能够优化工作流程、帮助他们更快编写高质量代码的工具。Cursor 作为一款 AI 驱动的代码编辑器&#xff0c;正在彻底改变我们的编程方式。但如…

【VUE】vue-i18n: Uncaught SyntaxError: Not available in legacy mode

报错&#xff1a; 解决方法&#xff1a; 找到 createI18n 并加上 legacy: false,