![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux C/C++
Linux
蓝子娃娃
越努力,越幸运!!!
展开
-
UNIX与Linux发展史
如果用父子关系来比喻 UNIX 和 Linux 的话还是比较合适的。UNIX 是父亲,Linux 是儿子。 UNIX 是一个相对来讲在现在的主流系统中比较古老的分支,在60年代初期就有一个雏形了,而 Linux 是90年代初才有,而 Windows 大概是 80年代。 其实,UNIX是有3家机构和公司共同来联合开发的一个计划演变而来的。这三家都是鼎鼎大名,有一家就是耳熟能详的大学叫麻省理工(MIT),有一家是非常出名的企业叫通用电器公司(GE),还有一个在国际上都很闻名的机构叫贝尔实验室。三家联原创 2020-11-25 21:48:59 · 1039 阅读 · 0 评论 -
Linux 基本命令
Linux 基本命令1. Linux 文件与目录管理ls:列出目录cd:切换目录pwd:显示当前的目录mkdir:创建一个新的目录rmdir:删除一个空的目录cp 复制文件或目录rm:移除文件或目录2. Linux 文件内容查看cat:由第一行开始显示文件内容tac:从最后一行开始显示head -n log.txt:显示 log.txt 开头n行tail -n log.txt:显示 log.txt 末尾n行3. 内存和 CPUps -aux | grep 进程id:查原创 2020-09-08 14:56:06 · 64 阅读 · 0 评论 -
Linux其他知识
文章目录终端终端的启动流程ttyname 函数网络终端进程组1. 概念和特性2. 进程组操作函数会话创建会话守护进程创建守护进程模型终端在 Unix 系统中,用户通过终端登录系统后得到一个 shell 进程,这个终端成为 shell 进程的控制终端(Controlling Terminal),进程中,控制终端是保存在 PCB 中的信息,而 fork 会复制 PCB 中的信息,因此由 shell 进程启动的其他进程的控制终端也是这个终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准错误输原创 2020-08-10 09:43:31 · 359 阅读 · 0 评论 -
Linux信号(四)
文章目录SIGCHLD 信号1. SIGCHLD 的产生条件2. 借助 SIGCHLD 信号回收子进程信号传参1. 发送信号传参2. 捕捉函数传参中断系统调用SIGCHLD 信号1. SIGCHLD 的产生条件子进程终止时子进程接收到 SIGSTOP 信号停止时子进程处在停止态,接受到 SIGCONT 后唤醒2. 借助 SIGCHLD 信号回收子进程子进程结束运行,其父进程会收到 SIGCHLD 信号。该信号的默认动作时忽略。可以捕捉该信号,在捕捉函数中完成子进程状态的回收。#inc原创 2020-08-09 20:40:39 · 612 阅读 · 0 评论 -
Linux信号(三)—— 时序竞态
文章目录pause 函数时序问题分析解决时序问题总结全局变量异步 I/O可重入/不可重入函数pause 函数调用该函数可以造成进程主动挂起,等待信号唤醒。调用该系统调用的进程将处于阻塞状态(主动放弃 CPU)直到有信号递达将其唤醒。int pause(void); //返回值:-1,并设置 errno 为 EINTR[返回值]如果信号的默认处理动作是终止进程,则进程终止,pause 函数没有机会返回如果信号的默认处理动作是忽略,进程继续处于挂起状态,pause 函数不返回如果信号的处理原创 2020-08-07 19:33:22 · 219 阅读 · 0 评论 -
Linux通信之信号(二)
文章目录信号集操作函数信号集设定1. sigprocmask 函数2. sigpending 函数信号捕捉1. signal 函数2. sigaction 函数信号捕捉特性内核实现信号捕捉过程信号集操作函数内核通过读取未决信号集来判断信号是否应被处理,信号屏蔽字 mask 可以影响未决信号集。而我们可以在应用程序中自定义 set 来改变 mask。以达到屏蔽指定信号的目的。信号集设定sigset_t set; //typedef unsigned long sigset_t;i原创 2020-08-05 10:12:50 · 221 阅读 · 0 评论 -
Linux通信之信号
信号一、信号的机制A给B发送信号,B收到信号之前执行自己的代码,收到信号之后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为"软中断"。信号的特质:由于信号是通过软件方法实现,其实现手段导致信号有很强的延时性。但对于用户来说,这个延时时间非常短,不易察觉。每个进程所收到的所有信号,都是由内核负责发送的,内核处理二、与信号相关的事件和状态产生信号按键产生,如:Ctrl+c、Ctrl+z原创 2020-08-03 13:11:10 · 82 阅读 · 0 评论 -
Linux常规信号一览表
Linux 常规信号一览表SIGHUP:本信号在用户终端结束时发出,通常是在终端的控制进程结束时,通知同一会话期内的各个作业,这时他们与控制终端不在关联。比如,登录Linux时,系统会自动分配给登录用户一个控制终端,在这个终端运行的所有程序,包括前台和后台进程组,一般都属于同一个会话。当用户退出时,所有进程组都将收到该信号,这个信号的默认操作是终止进程。此外对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。SIGINT:程序终止信号。当用户按下CRTL+C时通知前台进程组终止进程。.原创 2020-07-31 14:03:33 · 1986 阅读 · 0 评论 -
Linux通信方式之信号
信号一、信号的机制A给B发送信号,B收到信号之前执行自己的代码,收到信号之后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为"软中断"。信号的特质:由于信号是通过软件方法实现,其实现手段导致信号有很强的延时性。但对于用户来说,这个延时时间非常短,不易察觉。每个进程所收到的所有信号,都是由内核负责发送的,内核处理二、与信号相关的事件和状态产生信号按键产生,如:Ctrl+c、Ctrl+z原创 2020-07-31 13:38:04 · 143 阅读 · 0 评论 -
Linux线程通信之共享映射区
IPC方法(InterProcess Communication)Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区中把数据读走,内核提供的这种机制称为进程间通信在进程间完成数据传递需要借助os提供的特殊方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等。现如今常用的原创 2020-07-26 12:01:41 · 386 阅读 · 0 评论 -
Linux通信之管道通信
IPC方法(InterProcess Communication)Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区中把数据读走,内核提供的这种机制称为进程间通信在进程间完成数据传递需要借助os提供的特殊方法,如:文件、管道、信号、共享内存、消息队列、套接字、命名管道等。现如今常用的原创 2020-07-24 11:05:56 · 255 阅读 · 0 评论 -
Linux之回收子进程
回收子进程孤儿进程父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为 init 进程,称为 init进程(进程ID为1)领养孤儿进程【验证孤儿进程】#include <stdio.h>#include <unistd.h>int main(){ pid_t pid; pid = fork(); if(pid < 0) { perror("fork error\n"); return -1; } else if(pid > 0原创 2020-07-23 13:01:12 · 500 阅读 · 0 评论 -
Linux之exec函数族
exec函数族fork函数创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个函数。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并没改变将当前的进程.text、.data替换为所要加载的程序的.text、.data,然后让进程从新的.text第一条指令开始执行,但进程ID不变,换核不换壳其中有六种以exec开头的函数,统称原创 2020-07-22 11:32:46 · 258 阅读 · 0 评论 -
Linux之进程共享
进程共享getuid 函数【获取当前进程实际用户ID】uid_t getuid(void);【获取当前进程有效用户ID】uid_t geteuid(void);getgid 函数【获取当前进程使用用户组ID】gid_t getgid(void);【获取当前进程有效用户组ID】gid_t getegid(void);进程共享父子进程之间在fork后。有哪些相同,哪些不同呢?【fork之后】同:全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作原创 2020-07-21 10:54:18 · 220 阅读 · 0 评论 -
Linux之循环创建多个子进程
创建进程进程控制原语fork函数 pid_t fork(void); //创建一个子进程【返回值】有两个 一个进程 --> 两个进程 --> 各自对fork做返回- 返回子进程的pid(非负整数 > 0) (父进程)- 返回0 (子进程)创建单个子进程【练习】#include <stdio.h>#include <unistd.h>//创建单个子进程int main(){ pid_t pid; printf(原创 2020-07-21 09:55:32 · 2161 阅读 · 0 评论 -
Linux之环境变量
环境变量环境变量:是指在os中用来指定os运行环境的一些参数,通常具备以下特征:字符串(本质)有统一的格式:名=值[:值]值用来描述进程环境信息存储形式:与命令行参数类似。char *[]数组,数组名environ,内部存储字符串,NULL作为哨兵结尾(防止溢出)使用形式:与命令行参数类似。加载位置:与命令行参数类似。位于用户区,高于stack的起始位置引入环境变量表:须声明环境变量。extern char **environ;常见的环境变量PATH可执行文件的搜索路径,l原创 2020-07-20 09:14:22 · 148 阅读 · 0 评论 -
Linux进程之(一)进程相关概念
进程相关概念程序和进程程序:是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu/内存/打开的文件/设备/锁……)进程:是一个抽象的概念,与操作系统原理联系紧密。进程是活跃的程序,占用系统资源。在内存中执行。(程序运行起来,产生一个进程)打个比方 程序 -> 剧本(纸) 进程 -> 戏(舞台、演员、灯光、道具)同一个剧本可以在多个舞台同时上演。同样,同一个程序也可以加载不同的进程(彼此之间互不影响)如:同时开两个终端,各自都有一个bash但彼此ID不同并发并发:在o原创 2020-07-19 11:19:56 · 179 阅读 · 0 评论 -
Linux多线程之进程间互斥量
进程间同步互斥量 mutex进程间也可以使用互斥锁,来达到同步的目的。但应在 pthread_mutex_init 初始化之前,修改其属性为进程间共享。mutex的属性修改函数主要有以下几个主要应用函数1. pthread_mutexattr_t mattr 类型:用于定义mutex锁的【属性】2. pthread_mutexattr_init 函数:初始化一个mutex属性对象 int pthread_mutexattr_init(pthread_mutexattr_t *attr)3. p原创 2020-07-18 11:08:53 · 569 阅读 · 0 评论 -
Linux多线程之信号量实现生产者消费者模型
信号量(与信号没有任何关系)【进化版互斥锁 (1–>N)】由于互斥锁的粒度比较大,如果我么希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降。线程从并行执行变化了串行执行。与直接使用单进程无异。【信号量:是相对折中的一种处理方式,既能保证同步,数据不混乱,又能提高高线程并发】主要应用函数1. sem_init 初始化信号量2. sem_destroy原创 2020-07-17 14:16:59 · 746 阅读 · 0 评论 -
Linux多线程之条件变量(生产者和消费者模型)
条件变量【条件变量本身不是锁!但是它也可以造成线程阻塞。通常与互斥锁配合使用。给多进程提供一个会和的场所(共享数据)】主要应用函数1. pthread_cond_init //初始化条件变量2. pthread_cond_destroy //销毁条件变量3. pthread_cond_wait //线程等待信号触发,如果没有信号触发,无限期等待下去。4. pthread_cond_timedwait //线程等待一定的时间,如果超时或有信号触发,线程唤醒。5. pthread_con原创 2020-07-17 14:04:10 · 1679 阅读 · 0 评论 -
Linux多线程之线程同步
线程同步同步即协同步调,按预定的先后次序运行线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其他线程为保证数据一致性,不能调用该功能因此,"多个控制流,共同操作一个共享资源"的情况,都需要同步数据混乱的原因资源共享(独享资源不会)调度随机(意味着数据访问会出现竞争)线程间缺乏必要的同步机制互斥量Linux中提供一把互斥锁 mutex(也称之为互斥量)每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁资源还是共享的,线程间也还是竞争原创 2020-07-15 11:05:35 · 219 阅读 · 0 评论 -
Linux之多进程拷贝与多线程拷贝
Linux之多进程拷贝编写思路假设我们想让n个进程共同完成对一个文件的拷贝那我们首先得求出让每个进程拷贝多少字节,一般是均分,也可以自己设定,这里我采用均分。怎么求呢?先求出文件大小,再除以进程个数,这里要考虑到不能整除的情况,那我们直接向上取整即可在创建进程后,我让父进程只进行文件指针的移动,子进程进行文件的拷贝【让我们开始编写代码吧】#include <stdio.h>#include <stdlib.h>#include <string.h>原创 2020-07-14 11:30:21 · 925 阅读 · 0 评论 -
Linux系统编程之线程(三)
线程属性线程属性初始化【注意】应先初始化线程属性,再创建线程初始化线程属性int pthread_attr_init(pthread_attr_t *attr); 成功:0;失败:错误号销毁线程属性所占用的资源int pthread_attr_destroy(pthread_attr_t *attr); 成功:0;失败:错误号pthread_attr_t结构体主要的结构体成员:线程分离状态线程栈的大小(默认平均分配)查看栈空间:ulimit -a -->原创 2020-07-13 14:39:21 · 95 阅读 · 0 评论 -
Linux系统编程之线程(二) 下
线程控制原语pthread_join 函数阻塞等待线程退出,获取线程退出状态其作用,对应进程中的waitpid()函数int pthread_join(pthread_t thread, void **retval);返回值:成功:0;失败:错误号参数: thread:线程ID【注意】不是指针 retval:存储线程结束状态【对比记忆】 进程中:main返回值(return xx)、exit参数均为int型值;等待子进程结束时可以用wait函数获取进程结束状态 wait函数的参数为in原创 2020-07-13 14:27:58 · 149 阅读 · 0 评论 -
Linux系统编程之线程(二) 上
线程控制原语pthread_self 函数获取线程ID,其作用是对应进程中的getpid()函数线程ID是进程内部识别标志(两个进程间,线程ID允许相同)【注意】不应该使用全局变量pthread_t tid,在子线程中通过pthread_create传出参数来获取线程ID,而应该使用pthread_selfpthread_create 函数创建一个线程线程与共享【牢记】线程默认共享数据段、代码段等地址空间,常用的是全局变量。而进程不共享全局变量,只能借助mmap【练习】设计程序,验原创 2020-07-12 13:00:06 · 162 阅读 · 0 评论 -
Linux系统编程之线程(一)
线程的概念什么是线程LWP:light weight process 轻量级的进程,本质仍是进程(在Linux下)进程:独立地址空间(每创建一个进程,拥有0-4GB的独立进程地址空间),拥有PCB(进程描述符)线程,也有PCB,但没有独立的地址空间(共享)区别:在于是否共享地址空间 独居(进程) 合租(线程)Linux下:线程:最小的执行单位,即系统调度的最小单位进程:最小资源分配单位,可看成只有一个线程的进程Linux内核线程实现原理线程,也有PCB,创建线程使用的底层函数和进原创 2020-07-12 10:06:46 · 145 阅读 · 0 评论 -
基于Linux的C++网络畅聊系统(一)
项目概述采用网络编程技术,结合CS模型,完成一个微型QQ群聊功能技术特点C++ STL生产者和消费者模型多线程技术,线程的同步与互斥网络编程开源jsoncpp库ncurses库自定义协议(模仿http),用于登录注册认证项目定位研发岗为何做这个项目保持好奇心,模拟QQ实现,做一个基本的聊天IM进行项目深度扩展,加强代码能力项目原理登录/注册【注册】用户输入的注册信息,若注册成功,服务器返回给客户一个大于等于10000的ID账号,即登陆账号【登录】用户通过输入自原创 2020-07-12 08:02:34 · 295 阅读 · 0 评论