Linux高级编程
文章平均质量分 83
小袁OVO
这个作者很懒,什么都没留下…
展开
-
编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推首先三个线程如果不同步的话,是处于竞争状态的,那么会导致乱序执行,系统的调度算法是时间片轮询的话,那么会出现一个线程运行一段时间,然后另一个线程再运行一段时间…要满足ABCABC…一次递推的话,那么必然要使用同步的方法控制三个线程的运行顺序A->B B->C C->A这三个线程相当于是一个环,都互相死等,此时是处于死锁原创 2021-05-17 14:49:49 · 806 阅读 · 1 评论 -
Linux高级编程之多线程同步
线程同步互斥和同步互斥: 是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步: 是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源1 互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。2 同步是指在互斥的基础上(大原创 2021-05-17 14:45:40 · 172 阅读 · 0 评论 -
Linux高级编程之多线程
多线程典型的进程可以看成是只有一个控制线程(主线程)。一个进程在某一时刻只能做一件事情。有了多个控制线程之后,在程序设计时就可以把程序设计成在某一时刻能够做不止一件事,每个线程处理各自独立的任务。1、进程的两个基本属性1、进程是一个可拥有资源的独立单位,一个进程要能独立运行,它必须拥有一定的资源,包括用于存放程序正文、数据的磁盘和内存地址空间,以及它在运行时所需要的I/O设备、已打开的文件。信号量等。2、进程同时又是一个可独立调度和分派的基本单位;每个进程在系统中都有唯一的PCB,系统可以根据PC原创 2021-05-17 14:35:40 · 208 阅读 · 0 评论 -
TCP/IP协议栈
TCP/IP协议栈TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。TCP/IP 协议采用4层结构,分别是应用层、传输层、网络层和链路层,每一层都呼叫它的下一层所提供的协议来完成自己的需求。由于我们大部分时间都工作在应用层,下层的事情不用我们操心;其次网络协议体系本身就很复杂庞大,入门门槛高,因此很难搞清楚TCP/IP的工作原理,通俗一点讲就是,一个主机的数据要经过哪些过程才能发送到对方的主机上。 接下来,我们就来探索一下转载 2021-05-11 17:30:40 · 3320 阅读 · 0 评论 -
Linux高级编程之进程环境
二、进程1、进程环境1.1 main 函数 C程序总是从main函数开始执行,main函数的原型是:int main(int argc, char * argv[]); 其中 argc是 命令行参数的数目,argv是指向参数的各个指针所构成的数组 当内核执行C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。 可执行程序文件将此启动历程指定为程序的起始地址-----这是由链接编译器设置的,儿链接编译器则由C编译器调用。 启动例程从内核取得命令行参数和环境变量原创 2021-05-11 16:13:42 · 122 阅读 · 0 评论 -
Linux进程间通信之IPC通信
4、IPC通信IPC通信: 消息队列、信号量以及共享内存4.1、标识符和键 key 每个内核中的IPC结构(消息队列、信号量或共享存储段)都用一个非负整数的标识符(identifier)加以引用。 标识符key 是IPC对象的内部名。为使多个合作进程能够在同一IPC对象上汇聚,需要提供一个外部命名方案。为此,每个IPC对象都与一个键key相关联,将这个键作为该对象的外部名。 无论何时创建IPC结构(通过msgget(消息队列)、semget(信号量)、shmget(共享内存)创建),原创 2021-05-11 16:13:05 · 742 阅读 · 0 评论 -
Linux进程通信之信号
3、信号信号是软中断。很多比较重要的应用程序都需处理信号。 某个信号出现时,可以告诉内核按照一下3种方式进行处理,我们称之为信号的处理或与信号相关的动作。(1) 忽略此信号 大多数信号都可以使用这种方式进行处理,**但有两种信号却决不能被忽略他们是SIGKILL和SIGSTOP信号。**这两种信号不能被忽略的原因是:他们向内核和超级用户提供了使进程终止或停止的可靠方法。(2)捕捉信号 为了捉到这一点,要通知内核在某种信号发生时,调用一个用户函数。在用户函数中,可执行用户希望对这种事件原创 2021-05-10 16:14:45 · 225 阅读 · 0 评论 -
Linux进程通信无名管道和有名管道
三、进程间通信1、 无名管道 无名管道:1、半双工 2、只有具有亲缘关系的两个进程才可使用主要是用于父子进程间进行通信1、pipe函数创建无名管道#include <unistd.h> int pipe(int fd[2]);//成功返回0 , 失败返回-1经由参数返回2个文件描述符,fd[0] 为读而打开,fd[1]为写而打开 , fd[1]的输出是fd[0]的输入通常,进程会先调用pipe,接着调用fork,从而创建从父进程到子进程的IPC通道。fork之后做什原创 2021-05-10 15:59:55 · 276 阅读 · 0 评论 -
守护进程
5、 守护进程 守护进程(daemon) 是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。UNIX系统有很多守护进程,它们执行日常事务活动。5.1 编程规则(1) 调用umask 首先要做的是调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0)。因为继承来的umask 是linux系统的一般是0022,当设置为有 r 权限时,便会被屏蔽掉,那么这并不是我们想得到的结果(2) 调用fork,然后父进程exit原创 2021-05-10 15:51:55 · 341 阅读 · 0 评论 -
exec函数族
exec函数族在进程中运行新的代码当进程调用一种exec函数时,该进程执行的程序完全替代为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后进程ID并未改变。exec只是用磁盘上的一个程序替换了当前进程的正文段、数据段、堆段和栈段exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何linux下可执行的脚本文件内核也是使用exec来启动一个程序原创 2021-05-10 15:49:41 · 287 阅读 · 0 评论 -
孤儿进程和僵尸进程
孤儿进程和僵尸进程 孤儿进程 : 父进程结束后,子进程还没有结束,这个子进程就叫做孤儿进程 孤儿进程最后被init 领养 (无害) 僵尸进程: 子进程结束了, 但是父进程没有对其进行善后处理(获取终止子进程的有关信息、释放它仍占用的资源)的进程被称作僵尸进程 也就是父进程没有回收子进程的PCB (有害需要避免,因为僵尸进程已经挂掉了,对系统没有什么作用,但是依然在进程表占了位置,如果OS有大量的僵尸进程,那么进程号就会被大量无故占用,严重的话再次fork进程可能失败)4.7.1原创 2021-05-10 15:47:11 · 165 阅读 · 0 评论 -
Linux高级编程之进程
3、进程描述 进程是进程实体的运行过程,是系统进行_资源分配_和_调度_的一个独立单位。 为了使参与并发执行的每个程序(含数据)都能独立地运行,在操作系统中必须为之配置一个专门的数据结构PCB(进程控制块Process Control Block), 系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。由程序段、相关的数据段和PCB三部分便构成了进程实体(进程) ,所谓创建进程实质上就是创建PCB3.1 进程的基本状态及切换(1) 就绪状态这是指进程已处于准备好运行的状态,原创 2021-05-10 15:42:58 · 130 阅读 · 0 评论 -
C程序的存储空间布局
2、C程序的存储空间布局 我们常说的C内存4区 1、正文段 ; 2、 初始化数据段; 3、 未初始化数据段; 4、 栈 ; 5、 堆2.1 正文段(代码段) 正文段:这是由CPU执行的及其指令部分。通常,正文段是可共享的,所以即使是频繁执行的程序(如文本编辑器,C编译器和shell等) 在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外而修改其指令2.2 数据段 数据段又分为 初始化数据段 、未初始化数据段、常量2.2.1 初始化数据段初始化数据段: 通常将原创 2021-05-10 15:35:42 · 208 阅读 · 0 评论 -
Linux高级编程之制作库
4、制作库4.1 库的概念库是写好的,现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:二者主要的区别: 静态库在编译时链接, 动态库在运行时链接静态库: 名称为 libxxx.a ,在编译时就将库编原创 2021-05-10 15:21:44 · 99 阅读 · 2 评论 -
Linux高级编程之目录IO
3、目录I/O文件IO与目录IO对比目录IO文件IOopendir 打开目录open 打开文件mkdir 创建目录O_CREAT 或者使用create函数readdir 读目录read读文件closedir 关闭目录close关闭文件3.1 创建目录 mkdir函数 #include <sys/stat.h> #include <sys/types.h> int mkdir(c原创 2021-05-10 15:18:22 · 91 阅读 · 0 评论 -
Linux高级编程之文件I/O
一、文件I/O1、文件IO与标准IO1.1、什么是文件I/O? 文件IO就是直接调用内核提供的系统调用函数。1.2、什么是标准I/O? 标准IO就是间接调用系统调用函数,是C库函数。1.3、文件IO和标准IO的区别文件IO是直接调用内核提供的系统调用函数,头文件是unistd.h,标准IO是间接调用系统调用函数,头文件是stdio.h,文件IO是依赖于Linux操作系统的,标准IO是不依赖操作系统的,所以在任何操作系统下,使用标准IO,也就是C库函数操作文件的方法都是相同的。2、文原创 2021-05-10 15:16:29 · 391 阅读 · 2 评论