
linux
乐行僧丶
这个作者很懒,什么都没留下…
展开
-
动态库和静态库
一、静态库a.cc b.cc c.cc1.g++ *.cc -c2.ar rcs libxxx.a *.o 把*.o打包成一个名为xxx的静态库二、动态库a.cc b.cc c.ccg++ -fpic -shared *.cc -o libxxx.so 编译生成一个动态库原创 2021-01-15 13:57:53 · 167 阅读 · 0 评论 -
同步、异步、阻塞和非阻塞
同步和异步同步:是用户线程发起IO请求需要等待或者轮询内核IO操作完成后才能继续执行。异步:用户线程发起IO请求后任需要继续执行,当内核IO操作完成后会通知用户线程,或者调用用户注册的回调函数。阻塞和非阻塞阻塞:是指IO操作需要彻底完成后才能返回用户空间。非阻塞:是指IO操作被调用后立即返回一个状态值,无需等待IO操作完成。同步和异步(线程间调用)同步和异步是对应调用者和被调用者,他们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。同步操作时,调用者需要等待被调用者返回结果,才能进原创 2021-01-03 20:51:14 · 374 阅读 · 0 评论 -
x86保护模式下的内存分段的地址映射
阅读此文,先熟悉x86体系早期的实模式下的内存分段的地址映射。正是由于在实模式下直接对物理内存进行读写,非常不安全,所以诞生了新的内存分段的映射方式,其目的就是对物理内存进行保护,而对内存进行保护需要注意的是一下三点:1.内存的起始地址。2.内存的长度。3.内存的权限信息。此时CPU的架构已经来到了32位,寻址能力达到了2^32=4G。此前的分段地址映射的模式已经不再适用,但是Intel...原创 2020-03-13 14:54:54 · 763 阅读 · 0 评论 -
x86体系早期的实模式下的内存分段的地址映射
实模式:程序员可以直接在物理地址上进行编写程序,此时还没有操作系统进行内存的管理。实模式下的CPU架构为:8086,16位数据总线,20位的地址总线。可寻址空间大小为2^20=1M,但是由于数据总线仅仅支持16位,而由CPU法出的地址却是20位,为了使得地址位数为16。8086进行了这样的规定:物理内存的地址必须是16的倍数,也就是说经过分段,段大小在这个区间[16, 2^16=64k]。这样做...原创 2020-03-13 14:05:30 · 591 阅读 · 0 评论 -
fork与缓冲区的问题
(1)在分析这个问题之前,先得熟悉一下缓冲区以及标准I/O中printf相关的问题。printf行缓冲的概念以及刷新缓冲区的条件(2)关于fork,在本例分析中只需要记住一点,fork之后子进程的地址空间中是拷贝了父进程的缓冲区的。例1:#include <stdio.h>#include <unistd.h>#include <sys/types.h&g...原创 2020-02-14 14:42:51 · 927 阅读 · 3 评论 -
记录Linux编程中遇到的问题
sudo apt-get intall vim-gui-common原创 2020-02-13 21:47:32 · 263 阅读 · 0 评论 -
TCP三次握手
原创 2020-02-06 16:22:24 · 163 阅读 · 0 评论 -
Linux: errno合集,各种errno对应的出错问题,方便查询
#define EPERM 1 /* Operation not permitted */#define ENOENT 2 /* No such file or directory */#define ESRCH 3 /* No such process */#define EINTR 4 /* Interrupted system call */#define EIO ...原创 2020-02-06 14:58:23 · 1126 阅读 · 0 评论 -
进程通信(三)共享内存
一、共享内存共享内存是操作系统直接在物理内存上开辟一段空间作为进程间通信的缓冲区域, 与管道、消息队列等其他进程通信方式相比较,共享内存拥有更高的效率,原因是共享内存的设计是基于物理内存的地址直接进行操作的,这样相比其他方式的IPC省去了重重的系统调用,因此在很大程度上提高了其效率。二、共享内存原理当不同进程的虚拟地址空间按照页面的大小加载到内存时,CPU发出的虚拟地址经过MMU(内存管理...原创 2020-02-02 11:26:14 · 300 阅读 · 0 评论 -
关于System V进程通信内核对象的删除
System v ipc的缺点:当进程结束时,不会自动删除进程通信的内核对象,并且能够使用ipcs命令查看内核对象,如下:由于进程通信内核对象也属于操作系统的资源,如果长期占用并且不使用确实是对操作系统资源的浪费,因此对于不再使用的进程通信内核对象应当及时删除,那么如何删除呢?(1)重启OS,没啥大毛病,但是不方便。(2)当进程使用完毕后,调用相应的系统API进行删除,当然这里需要注意的...原创 2020-01-31 15:35:57 · 281 阅读 · 0 评论 -
Linux: ipcs命令,查看os进程通信的内核对象信息
ipcs --help用法: ipcs [资源选项...] [输出选项] ipcs -m|-q|-s -i <id>显示 IPC 设施的信息。选项: -i, --id <id> 打印由<id>标识的资源的详细信息 -h, --help display this help -V, --version display version...原创 2020-01-31 14:43:18 · 390 阅读 · 0 评论 -
进程通信(二)消息队列(System V 消息队列)
一、System V 消息队列简介消息队列:消息队列的本质是由Linux内核创建用于存放消息的链表,并且其功能是用来存放消息的,所以又称之为消息队列。在Linux的不同进程中,包括有血缘的进程和无血缘的进程,都可以通过Linux消息队列API所得到的消息队列唯一标识符对消息队列进行操作。二、分析消息队列的数据结构Linux为了维护消息队列,为消息队列创建了数据结构,接下来我们来分析一下消息...原创 2020-01-31 14:41:34 · 277 阅读 · 0 评论 -
git本地仓库的使用流程
一、基本设置1.设置用户名git config --global user.name "你的用户名"2.设置邮箱git config --global user.email "你的邮箱地址"3.查看设置git config --list3.删除设置git config --global --unset user.name二、初始化本地仓库1.新建本地仓库目录文件夹2...原创 2019-04-06 18:03:55 · 327 阅读 · 0 评论 -
linux下使用core文件对程序进行debug
一.简单介绍什么是core文件以及他的作用在linux编写的C/C++可执行程序往往会出现如下图的错误,一个core dumped。由于刚开始对linux的认识不足,就忽略了这样一个重要的调试信息。随着学习的深入,其实core文件在linux下是一种ELF格式的文件,有关于什么是ELF格式大家可以自行查阅相关的内容。实际上core文件就是可执行文件执行时的映像,也可以叫做内存的快照。保存...原创 2019-01-13 21:16:50 · 914 阅读 · 0 评论 -
linux下检测内存泄漏
使用开源工具valgrind下载请点击,发行版本链接安装步骤:1.解压文件 tar -jxvf valgrind-x.x.x.tar.bz22.进入文件目录 cd valgrind-x.x.x3.在目录下执行 ./configure4.使用make进行自动化编译 make5.安装 make installubuntu用户可以使用:sudo apt-get install ...原创 2018-12-27 17:28:02 · 750 阅读 · 0 评论 -
信号量
头文件:include <semaphore>主要的函数:1.初始化信号量函数原型:int sem_init(sem_t* sem,int pshared,unsigned int value)参数:sem:指定是哪一个信号量pshared:指定信号量的类型,值为0表示是在当前进程使用的局部信号量,否则该信号量就可以在多个进程中共享。value:指定信号量的初始值,可以理...原创 2020-05-06 07:58:56 · 332 阅读 · 0 评论 -
C/S模式下---多线程编程
服务器采用单进程/线程编程,在同一时刻,服务器只能与一个客户端进行交互。只有与当前客户端的通信结束后,才能为下一个客户端进行服务。所以,如果采用线程,让主线程连接客户端,而函数线程为每个客户端进行服务,这样就可以保证服务器可以同时为多个客户端提供服务,实现并发。采用多线程的优势1.线程占用资源少。2.从CPU的工作角度上看,线程的切换速度要比进程快。3.资源共享,线程之间的通信更加简单。...原创 2018-11-29 15:27:33 · 562 阅读 · 0 评论 -
C/S模式下---多进程编程
在单进程下进行socket的编程,服务器通过accept()获取到客户端的文件描述符,并且与该客户端进行交互。但是实际有两方面的因素都促使服务器应该能够同时与多个客户端进行交互。1.listen()函数将已经完成三次握手和即将完成三次握手的客户端文件描述符存放到队列中。2.在实际客户端与服务器进行交互时,服务器必须能够同时与多个客户端进行交互。多进程编程的优势:1.能够处理同时处理多个客户...原创 2018-11-29 14:25:47 · 342 阅读 · 0 评论 -
多线程访问共享的全局变量引发的数据混乱
1.线程共享全局变量在学习线程的相关概念之后,想探究在进程的虚拟地址空间当中的哪些区域是进程中多个线程共享的。 探究发现,全局变量在不同的线程当中访问全局变量是共享的。举例如下:#include<stdio.h>#include<assert.h>#include<pthread.h>//线程库char *str;//定义指向字符串的全局变量s...原创 2018-04-17 19:55:06 · 16950 阅读 · 2 评论 -
子进程继承父进程的锁
fork函数调用会创建子进程,子进程的地址空间是在调用fork时父进程地址空间的拷贝。因为子进程地址空间跟父进程一样,所以调用fork时,子进程继承了父进程中的所有互斥锁、读写锁和条件变量(包括它们的状态)。 但在多线程环境中,调用fork时,子进程中只有一个线程存在,这个线程是调用fork函数的那个线程,其他线程都没有被拷贝。 根据上述两点,子进程中的锁可能被不存在的线程所拥...转载 2018-04-20 20:47:41 · 1384 阅读 · 0 评论 -
linux系统调用函数 lstat--获取文件属性
所需头文件:#include<unistd.h>#include<sys/stat.h>#include<sys/types.h>函数功能:用来获取linux操作系统下文件的属性。 函数原型: int stat(const char *pathname,struct stat *buf);参数:第一个参数为传入参数,pathname为文件的...原创 2018-05-13 09:03:56 · 21239 阅读 · 0 评论 -
TCP协议的特点及TCP头部结构信息
TCP协议的特点: (1)相对于传输层的UDP协议,TCP协议的特点是面向连接的、可靠的传输和字节流。 (2)使用TCP协议通信的双方必须首先建立连接,然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上的数据传输。TCP是全双工通信,即双方的数据读写可以通过一个连接进行。完成数据交换后,通信双方必须断开连接以释放系统资源。 (3)TCP是端对端的,所以基...原创 2018-05-14 11:17:20 · 1084 阅读 · 0 评论 -
linux系统调用函数 access--获取文件属性
#原创 2018-05-14 12:15:36 · 610 阅读 · 0 评论 -
linux系统调用函数 chmod/chown/truncate--修改文件属性
1.chmod 修改文件权限 所需头文件: #include&lt;sys/stat.h&gt; 函数原型: int chmod(const char *filename,int mode) 参数: filename为文件名,mode为文件权限,八进制数。 返回值:成功返回0,失败返回-1,同时errno会被设置为合适值。应用实例: 当前目录文件下: 我们在应用chmod...原创 2018-05-14 17:39:33 · 4409 阅读 · 0 评论 -
linux系统调用函数 rename/getcwd/chdir/mkdir/rmdir--目录操作相关函数
1.文件重命名 在linux的shell解释器中输入mv 原文件名 新文件名即可进行重命名,实际上C库函数提供了具有相同功能的系统调用函数rename。所需头文件:#include<stdio.h> 函数原型: int rename(const char *oldpath,const char *newpath) 参数: oldpath原文件名,newpath为新文件名。 ...原创 2018-05-14 18:33:04 · 2076 阅读 · 0 评论 -
opendir/readdir/closedir 目录遍历相关函数
1.打开目录 所需头文件:#include<sys/types.h>#include<dirent.h>opendir是一个C库函数,可以通过man 3 opendir查看函数相关的详细内容。函数原型:DIR *opendir(const char *name) 参数:name为目录名。 返回值:成功返回一个指向目录的指针,失败返回NULL,同时er...原创 2018-05-14 21:25:56 · 1412 阅读 · 0 评论 -
孤儿进程和僵尸进程的概念及进程回收(wait函数及waitpid函数)
一.孤儿进程 孤儿进程可以理解为一个子进程的父进程英年早逝(父进程先于子进程退出),就将这样的一个进程称为孤儿进程,在linux操作系统上。孤儿进程被init进程收养,此时孤儿进程的ppid==1,即init进程的pid == 1。也就是说init进程变成孤儿进程的父进程(干爹)。下面举例说明什么是孤儿进程:#include<unistd.h>#include<sys...原创 2018-05-26 10:34:50 · 2304 阅读 · 1 评论 -
linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结 Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲tar命令的基本用法: tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,...转载 2018-07-09 19:18:09 · 233 阅读 · 0 评论 -
linux系统调用函数 mmap--创建内存映射区(在虚拟地址空间上)/munmap--释放内存映射区
1.mmap函数 所需头文件:#include<sys/mman.h> 函数原型:void* mmap(void* addr,size_t length,int prot,int flags,int fd,off_t offset) 参数: 第一个参数void* addr是映射区的首地址,传NULL,让内核去指定,返回值用来指定映射区的首地址。第二个参数是映射区的大小siz...原创 2018-07-28 19:11:50 · 1713 阅读 · 0 评论 -
Linux中查看进程的虚拟地址空间内存布局
要查看一个进程的虚拟地址空间的内存布局,需要设置阻塞。如果设置阻塞,当./a.out按下去后,程序执行的速度非常快以至于来不及查看,所以需要设置阻塞。#include&amp;lt;stdio.h&amp;gt;int a;static int b=10;int main(int argc,char* argv[],char* envp[]){ int a=10;//stack ch...原创 2018-08-05 11:43:39 · 7927 阅读 · 2 评论 -
linux--解决登陆mysql数据库出现 “Access denied for user 'root'@'localhost' (using password: YES)”的问题
我的平台为redhat-linux,其它版本linux类同。请按照下列步骤依此执行,亲测有效:1.切换为root用户,停止mysql服务,service mysqld stop。2.在当前终端中输入mysqld_safe --user=mysql --skip-grant-tables --skip-networking。3.新打开一个终端输入mysql。4.进入mysql后,输入upd...原创 2018-11-25 22:58:25 · 1860 阅读 · 0 评论 -
软链接和硬链接
软链接-符号链接:相当于windows的快捷方式。创建命令:ln s 文件名 软链接的名字 ln-link s-soft特点:1.在linux中,软链接文件的颜色为浅蓝色。2.软链接的大小为原文件的文件名大小,即路径长度。3.软链接仅可在当前路径下使用,即和原文件在同一目录下。...原创 2018-11-24 20:29:11 · 411 阅读 · 0 评论 -
线程的概念及linux下线程库相关函数的使用
1.线程的概念 在linux操作系统下,线程的本质任然是进程。是轻量级的进程(light weight process)简称LWP,但线程与进程还是有很多的区别。1.1为什么要引入线程,线程相对于进程优势在哪里? 历史回顾:在20世纪90年代,由于多处理系统的迅速发展。提出了比进程更小且能够独立运行的单位——线程,以提高系统内程序并发执行的程度,改善操作系统的性能。创建进程时,需要为其...原创 2018-04-14 22:10:02 · 3478 阅读 · 0 评论