![](https://img-blog.csdnimg.cn/20201125181615920.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux环境编程
文章平均质量分 80
文件操作,进程线程,线程池coding,进程间通信等Linux编程。
编程小镇
贵有恒何必三更眠五更起,最无益只怕一日曝十日寒。
展开
-
线程同步(互斥量、死锁、读写锁、生产者与消费者模型实现)
线程同步(互斥量、死锁、读写锁、生产者与消费者模型实现)线程同步互斥量 mutexmutex 相关系统调用死锁读写锁条件变量实现生产者与消费者模型信号量实现生产者与消费者模型线程同步 在多线程进行 线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正在由其他线程修改的变量。 临界区是指访问某一共享资源的代码片段,并且这段代码的执行应为原子操作,也就是同时访问同一共享资源的其他线程不应终端该片段的执行。原创 2021-02-04 10:38:36 · 365 阅读 · 1 评论 -
线程基本概念
线程基本概念 与进程(process)类似,线程(thread)是允许应用程序 并发执行多个任务的一种机制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且 共享同一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段。(传统意义上的 UNIX 进程只是多线程程序的一个特例,该进程只包含一个线程) 进程是 CPU 分配资源的最小单位,线程是操作系统调度执行的最小单位。线程是轻量级的进程(LWP:Light Weight Process),在 Linux 环境下线原创 2021-02-02 08:44:52 · 132 阅读 · 0 评论 -
线程相关系统调用(pthread使用)
线程相关系统调用(pthread使用)创建线程(pthread_create())终止线程(pthread_exit())连接已终止线程(pthread_join())线程分离(pthread_detach())线程取消(pthread_cancel())线程属性创建线程(pthread_create())函数原型#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,原创 2021-02-02 14:17:38 · 1142 阅读 · 0 评论 -
守护进程
守护进程终端进程组会话守护进程创建守护进程终端 在 UNIX 系统中,用户通过终端登录系统后得到一个 shell 进程,这个终端成为 shell 进程的控制终端(Controlling Terminal),进程中,控制终端是保存在 PCB 中的信息,而 fork() 会复制 PCB 中的信息,因此由 shell 进程启动的其它进程的控制终端也是这个终端。 默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准原创 2021-01-29 21:27:23 · 126 阅读 · 0 评论 -
进程间通信(五)共享内存
进程间通信(五)共享内存共享内存的使用步骤相关系统调用小结 共享内存允许两个或者多个进程共享物理内存的同一块区域(通常被称为段)。由于一个共享内存段会成为一个进程用户空间的一部分,因此这种 IPC 机制无需内核介入。所有需要做的就是让一个进程将数据复制进共享内存中,并且这部分数据会对其他所有共享同一个段的进程可用。 与管道等要求发送进程将数据从用户空间的缓冲区复制进内核内存和接收进程将数据从内核内存复制进用户空间的缓冲区的做法相比,这种 IPC 技术的速度更快。共享内存的使用步骤调用 sh原创 2021-01-29 17:07:50 · 769 阅读 · 0 评论 -
进程间通信(四)信号
进程间通信(四)信号信号的基本概念产生信号的事件信号的目的与特点各种信号信号的状态及默认处理动作信号相关函数kill(), raise(), abort()alarm() 定时器setitimer() 定时器信号捕捉函数(signal(), sigaction())SIGCHLD 信号信号集未决信号集与阻塞信号集自定义信号集相关函数系统信号集操作函数信号的基本概念 信号是 Linux 进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟原创 2021-01-26 18:59:57 · 226 阅读 · 0 评论 -
进程间通信(三)内存映射
进程间通信(三)内存映射mmap()系统调用 内存映射(Memory-mapped I/O) 是将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。下面介绍内存映射相关的系统调用。 mmap()系统调用函数原型#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);int munmap(void原创 2021-01-25 14:07:54 · 333 阅读 · 0 评论 -
利用命名管道实现简单聊天功能
利用命名管道实现简单聊天功能进程A:以只写方式打开FIFO1以只读方式打开FIFO2循环读写数据进程B:以只读方式打开FIFO1以只写方式打开FIFO2循环读写数据chata.c如下#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <stdlib.h>#include <fcnt原创 2021-01-17 16:33:30 · 501 阅读 · 0 评论 -
进程间通信(二)有名管道
进程间通信(二)有名管道有名管道 / 命名管道创建命名管道的两种方式命令创建(mkfifo)系统调用创建(mkfifo())使用有名管道在两个进程之间进行通信有名管道 / 命名管道 匿名管道,由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道(FIFO),也叫命名管道、 FIFO文件。 有名管道(FIFO)不同于匿名管道之处在于它提供了一个路径名与之关联,以 FIFO的文件形式存在于文件系统中,并且其打开方式与打开一个普通文件是一样的,这样即使与 FIFO 创建进程不原创 2021-01-16 19:44:21 · 230 阅读 · 0 评论 -
进程间通信(一)匿名管道通信
进程间通信(一)管道通信管道介绍及特点匿名管道使用(pipe系统调用)管道缓冲区大小(ulimit -a)匿名管道通信实例 —— 实现 |小结巨人的肩膀 管道介绍及特点 管道也叫无名(匿名)管道,它是是 UNIX 系统 IPC(进程间通信)的最古老形式,所有的 UNIX 系统都支持这种通信机制。 举个例子,统计一个目录中文件的数目命令:ls | wc –l,为了执行该命令, shell 创建了两个进程来分别执行 ls 和 wc。中间的 | 为管道符,ls 进程将得到的结果(默认输出至终端)交原创 2021-01-15 17:05:48 · 241 阅读 · 0 评论 -
Linux 进程回收的系统调用(wait、waitpid)
Linux 进程回收的系统调用(wait、waitpid)wait 系统调用waitpid 系统调用 在每个进程退出的时候,内核释放该进程所有的资源、包括打开的文件、占用的内存等。但是仍然为其保留一定的信息,这些信息主要主要指进程控制块PCB的信息(包括进程号、退出状态、运行时间等)。 父进程可以通过调用 wait 或 waitpid 得到它的退出状态同时彻底清除掉这个进程。注意:一次wait或waitpid调用只能清理一个子进程,清理多个子进程应使用循环。 wait 系统调用函数接口原创 2021-01-06 20:27:23 · 342 阅读 · 0 评论 -
进程退出的两个接口( exit()、_exit() )
进程终止 进程在被创建后,开始运行完成其工作。通常在下列几个条件使得进程退出:正常退出出错退出严重错误:程序中有bug被其他进程杀死进程退出的两个接口(exit 、 _exit)#include <stdlib.h>void exit(int status);#include <unistd.h>void _exit(int status);参数:status :进程退出时的一个状态信息。父进程在回收子进程资源时获取。示例1:exit#inc原创 2021-01-05 13:10:04 · 370 阅读 · 0 评论 -
Linux系统编程(十)exec 族函数
Linux系统编程(十)exec 族函数execl() 函数execlp() 函数 exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。 exec 函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程 ID 等一些表面上的信息仍保持原样,颇有些神似“三十六计”中的“金蝉脱壳”。看上去还是旧的躯壳,却已经注入了新的灵魂。只有调用失败了,它们才会返回 -1,从原程原创 2021-01-03 20:09:56 · 257 阅读 · 0 评论 -
Linux系统编程(九)dup、dup2 和 fcntl
Linux系统编程(九)dup、dup2 和 fcntl9.1 dup() 赋值新文件描述符9.2 dup2() 重定向文件描述符9.3 fcntl() 获取/修改文件状态Flag9.1 dup() 赋值新文件描述符包含头文件#include <unistd.h>函数原型int dup(int oldfd);参数oldfd :旧文件描述符返回值调用成功,返回新的文件描述符调用失败,返回-1,设置 errnodup() 从空闲文件描述符表中找一原创 2020-12-23 20:25:09 · 188 阅读 · 0 评论 -
Linux系统编程(八)目录操作系统调用
Linux系统编程(八)目录操作系统调用8.1 mkdir 创建目录8.2 rename 修改路径名8.3 chdir 修改进程的工作目录8.4 getcwd 获取当前工作目录8.5 opendir 打开一个目录8.6 readdir 读取目录中的数据8.7 closedir8.8 遍历目录8.1 mkdir 创建目录包含头文件#include <sys/stat.h>#include <sys/types.h>函数原型int mkdir(const char原创 2020-12-22 20:23:45 · 485 阅读 · 0 评论 -
Linux系统编程(七)文件权限系统调用
Linux系统编程(七)文件权限系统调用7.1 access 判断文件权限/文件是否存在7.2 chmod 修改文件权限7.3 chown 修改文件所在组 / 所有者7.4 truncate 缩减 / 扩展文件至指定大小7.1 access 判断文件权限/文件是否存在包含头文件 #include <unistd.h>函数原型int access(const char *pathname, int mode);参数pathname :文件路径mode :文件权限原创 2020-12-22 13:48:35 · 323 阅读 · 0 评论 -
Linux系统编程(六)文件IO
Linux系统编程(六)文件IO6.1 文件 IO6.2 虚拟地址空间6.3 文件描述符6.4 open 打开文件6.5 open 创建一个新文件6.7 read-读取文件 write-写入函数6.1 文件 IO 在内存角度,I (Input)指将文件从磁盘中读入内存,O (Output) 指将文件从内存中写入磁盘。在 C 语言中,对于文件的操作有如下 API 。 C 语言中的文件处理函数库看做第三方库,在不同平台,会调用底层的文件处理函数,所以是跨平台的,并且其通过缓冲区实现,更加高效易用。下原创 2020-12-20 00:38:37 · 328 阅读 · 3 评论 -
Linux系统编程(五)GDB调试
Linux系统编程(五)GDB调试5.1 GDB 介绍5.2 GDB查看代码相关命令5.3 GDB断点相关命令5.4 GDB 调试命令5.1 GDB 介绍使用GDB调试程序 是Linux后台必须掌握的技能。GDB可以帮我们完成:启动程序,可以按照自定义的要求随心所欲的运行程序可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式)当程序被停住时,可以检查此时程序中所发生的事可以改变程序,将一个 BUG 产生的影响修正从而测试其他 BUG下面来介绍 GDB 的基本用法。调试准备工作原创 2020-12-13 20:03:23 · 178 阅读 · 0 评论 -
Linux系统编程(四)Makefile编写
Linux系统编程(四)Makefile编写4.1 Makefile 文件介绍4.2 Makefile 命名与规则4.1 Makefile 文件介绍 在Winows 下,一般使用Visual Studio 进行编译调试,而在 Linux 的 C++ 工程中,编译器一般使用 makefile 来编译,如 Netbeans 编译器。所以在 Linux 开发时,不可避免会对工程文件的 Makefile 文件进行修改,本文介绍 Makefile 的用法,学会使用并编写Makefile 文件。 在大型工程中原创 2020-12-09 21:04:44 · 431 阅读 · 0 评论 -
Linux 系统编程(三)静态库与动态库的制作与使用
Linux 系统编程(三)静态库与动态库的制作与使用3.1 库文件3.1.1 静态库与动态库3.1.2 工作原理3.2 静态库制作3.2.1 静态库制作步骤3.2.2 运算库静态库实例3.2.3 静态库使用3.3 动态库的制作3.3.1 动态库制作步骤3.3.2 运算动态库实例3.3.3 动态库使用3.4 小结3.1 库文件3.1.1 静态库与动态库 库是一种特殊的程序,与一般程序不同,库不能单独运行。库文件分为 静态库 和 动态库(共享库)。静态库是在链接阶段,被复制到程序中,而动态库是在程序运行原创 2020-12-02 23:40:04 · 287 阅读 · 0 评论 -
Linux 系统编程(二)GCC 编译
Linux 系统编程(二)GCC 编译1 GCC 介绍及安装2 GCC编译过程3 GCC 常用编译选项1 GCC 介绍及安装 GCC全称为 GNU C编译器,由GNU开发编程语言译器,支持 C ,C++ ,Object-C ,Java ,Ada 等语言的编译。使用 std=c99 来指定语言标准。Linux 下安装 GCC 如下sudo atp install gcc g++查看版本gcc/g++ --versionGCC 与 G++ 联系与区别:GCC 与 G++ 都是GNU 组原创 2020-12-02 20:25:43 · 178 阅读 · 0 评论 -
Linux 系统编程(一)Linux开发环境+Visual Studio Code配置(真香)
Linux开发环境+Visual Studio Code配置(真香)Step 1:在`VS Code` 中下载并安装插件 `Remote Development`Step 2: 修改配置文件,连接远程服务器Step 3:连接远程服务器,打开远程文件夹Step 4:为远程服务器的编译器安装扩展Step 5:配置秘钥,打开文件夹时无需输入密码 在使用远程开发时,如果对 vim 的操作并不熟悉,coding 效率较为低下,使用Visual Studio Code 进行开发来提高效率。本文针对VS code 远原创 2020-12-01 23:50:51 · 786 阅读 · 0 评论