十四、Linux进程编程
一、进程概念
进程和线程的对比网上很多资料有介绍,这边有一篇文章,大家可以参考一下:https://www.cnblogs.com/qianqiannian/p/7010909.html
linux上查看进程的命令:top,就可以像window下查看任务管理器一下。按q退出。
二、进程ID
1、每一个进程都有一个唯一的标识符,进程ID 简称pid
- 进程id 一般默认的最大值为32768,不过也是可以修改的,当然一般情况下不需要这么做。如果当前进程是1000,那么下一个分配的进程就是1001,它是严格线性分配的。
- 除了init 进程,其它进程都是由其它进程创立的。创立新进程的进程叫父进程,新进程叫子进程。
2、获取子进程的函数
pid_t getpid(void)
– 参数:无
– 返回值:成功返回进程号
3、获取父进程的函数
pid_t getppid(void)
– 参数:无
– 返回值:成功返回父进程
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>void main()
{pid_t idp,id;idp = getppid();printf("ppid = %d\n",idp);id = getpid();printf("pid = %d\n",id);
}
三、exec函数族
1、2linux中,可以使用exec函数族将程序载入内存,实现多个程序的运行。
2、exec函数族参数
int execl(const char *path, const char *arg, ...)
函数说明:
execl()其中后缀"l"代表list也就是参数列表的意思,第一参数path字符指针所指向要执行的文件路径, 接下来的参数代表执行该文件时传递的参数列表:argv[0],argv[1]... 最后一个参数须用空指针NULL作结束。
函数返回值:
成功则不返回值, 失败返回-1。
3、execl函数特点:
当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。
用另一个新程序替换了当前进程的正文、数据、堆和栈段。
当前进程的正文都被替换了,那么execl后的语句,即便execl退出了,都不会被执行。
4、应用例程:代码1将调用代码2,代码2将替换代码1,
代码1:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <unistd.h>//exec函数族
int main(void)
{if(execl("/mnt/udisk/helloexec","helloexec","execl",NULL) == -1){perror("execl error");exit(1);}//程序已经跳转走,如果正常execl不反回错误,下面的代码不会执行!printf("execl error!\n");return 0;
}
代码2:
#include <stdio.h>int main(int arc,char *argv[])
{printf("Hello %s!\n",argv[1]);
}
5、exec函数簇还有很多其他的函数。
exec函数族参数
– “l”和“v”表示参数是以列表还是以数组的方式提供的
– “p”表示这个函数的第一个参数是*path,就是以绝对路径来提供程序的路径,也可以以当前目录作为目标
– “e”表示为程序提供新的环境变量
如下图,这边就不一一介绍了,大家可以在终端里输入man 3 exec 打开帮助文档,自己查看具体用法。
四、fork创建新进程
1、linux中,可以使用fork函数创建和当前进程一模一样的进程,叫子进程,原来的进程叫父进程。
2、创建进程函数
pid_t fork(void)
– 参数:无
– 返回值:执行成功,子进程pid 返回给父进程,0 返回给子进程;出现错误-1,返回给父进程。执行失败的唯一情况是内存不够或者id 号用尽,不过这种情况几乎很少发生。
#include <stdio.h>
#include <unistd.h>main()
{pid_t pid;int i=100;pid = fork();//调用出错if(pid == -1){printf("fork failed\n");return 1;}//返回给父进程子进程号,返回值大于0else if(pid){i++;printf("\nThe father i = %d\n",i);printf("The father return value is %d\n",pid);printf("The father pid is %d\n",getpid());printf("The father ppid is %d\n",getppid());while(1);}//返回子进程0,返回值等于0返回给子进程else{i++;printf("\nThe child i = %d\n",i);printf("The child return value is %d\n",pid);printf("The child pid is %d\n",getpid());printf("The child ppid is %d\n",getppid());while(1);}return 0;
}
运行结果如下:
十四、Linux进程编程相关推荐
- Linux的基本学习(十四)——进程管理(下)与SELinux
Linux的基本学习(十四)--进程管理(下)与SELinux 前言 进程这部分内容真是不少,来,我们继续跟着鸟哥学习. 特殊文件与进程 具有SUID/SGID权限的命令执行状态 SUID的权限其实与 ...
- Java基础学习——第十四章 网络编程
Java基础学习--第十四章 网络编程 一.网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信 ...
- 第二十四章 并发编程
第二十四章 并发编程 爱丽丝:"但是我不想进入疯狂的人群中" 猫咪:"oh,你无能为力,我们都疯了,我疯了,你也疯了" 爱丽丝:"你怎么知道我疯了&q ...
- Linux进程实践(1) --Linux进程编程概述
进程 VS. 程序 什么是程序? 程序是完成特定任务的一系列指令集合. 什么是进程? [1]从用户的角度来看:进程是程序的一次执行过程 [2]从操作系统的核心来看:进程是操作系统分配的内存.CPU时间 ...
- Linux 进程编程入门
关于进程和线程的关系,之前一口君写过这几篇文章,大家可以参考下. 本文从头带着大家一起学习Linux进程 <搞懂进程组.会话.控制终端关系,才能明白守护进程干嘛的?> <[粉丝问答6 ...
- 实验六 Linux进程编程,Linux系统编程实验六:进程间通信
<Linux系统编程实验六:进程间通信>由会员分享,可在线阅读,更多相关<Linux系统编程实验六:进程间通信(10页珍藏版)>请在人人文库网上搜索. 1.实验六:进程间通信l ...
- Linux 驱动开发 _ 视频广告机开发、Linux 进程编程介绍
介绍 Linux 下进程编程知识点,学习 fork 函数.管道.消息队列.共享内存.信号等同通信方式.并且介绍了广告机小项目的实现方法. 任务 1: 学习 Linux 下进程编程 1. 进程简介 进程 ...
- [linux专题]基于linux进程编程
目录 1.linux进程 1.1 基本知识 2 进程编程 2.1 创建进程 2.2 创建守护进程 2.3 退出进程 2.4 执行进程程序 2.5 等待进程结束 2.6 进程id 1.linux进程 1 ...
- Linux进程编程基础介绍
Linux系统是一个多进程的系统,它的进程之间具有并行性.互不干扰等特点.也就是说,每个进程都是一个独立的运行单位,拥有各自的权利和责任.其中,各个进程都运行在独立的虚拟地址空间,因此,即使一个进程发 ...
最新文章
- 程序员初试和复试_程序员的软微mem经验贴
- 特别推荐:15个精美 Metro UI 风格 WordPress 主题
- JAVA_OA(六):SpringMVC登陆实例
- 1.1 决策树算法原理
- 北大光华教授孟涓涓:数据时代,从3个层面看个人隐私问题
- 【报告分享】2021四大行业品牌蓝V社媒内容运营观察报告.pdf(附下载链接)
- 从单机到集群会话的管理之集群模式一
- 求n!的位数以及求n!具体的值(C or C++)
- java冒泡排序经典代码_java冒泡排序
- 利用CRISPR基因编辑高效靶向诱变玉米农作物/植物核糖蛋白复合物的研究
- 拼多多迈向后黄峥时代
- jquery后代选择器 和子选择器区别
- 大众点评热门餐厅抓取与数据分析
- 5G千兆工业路由器 poe供电
- 都匀三中2021高考成绩查询,都匀高考语文指南
- 一字一句体验语言的魅力-1:80386-datasheet翻译学习
- 怎么让猫吃辣椒 转载自 xiaotie
- 第十四章 习题14-11-习题14-20
- 金字塔的思维-结构化逻辑思维
- 东风本田crv2020新款混动说明书_2019东风本田crv锐混动 续航能力超强