linux系统编程
文章平均质量分 81
linux系统编程
lanhuazui10
这个作者很懒,什么都没留下…
展开
-
unix本地套接字(Unix Domain Socket)
因为不会再在文件系统中创建文件了,所以对于抽象路径名来说,就不需要担心与文件系统中已存在的文件产生名字冲突的问题了,也不需要在使用完套接字之后删除附带产生的这个文件了,当套接字被关闭之后会自动删除这个抽象名。还有,在默认情况下,在调用bind()函数时,会给所有者、组和其他用户赋予所有的权限(即777),如果想改变这个行为,可以在bind()之后再修改创建的文件的权限和属性。在这里,不同进程像这个服务器端进程发送的流数据是在内核里面区分的,并绑定到了accept()创建的套接字中了。转载 2023-10-21 16:47:59 · 675 阅读 · 0 评论 -
linux 内核 – ioctl 函数详解
在新版内核中, 与 取代了。在实际应用中,ioctl 最常见的 errorno 值为 ENOTTY(error not a typewriter),顾名思义,即第一个参数 fd 指向的不是一个字符设备,不支持 ioctl 操作,这时候应该检查前面的 open 函数是否出错或者设备路径是否正确。ioctl 是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设 ioctl() 命令的方式实现。转载 2023-10-09 19:43:47 · 1943 阅读 · 0 评论 -
Linux 文件锁 fcntl 函数详解
fcntl() 功能是针对文件描述符提供控制,根据不同的 cmd 对文件描述符可以执行的操作也非常多,用的最多的是文件记录锁,也就是 F_SETLK 命令,此命令搭配 flock 结构体,对文件进行加解锁操作,例如执行加锁操作,如果不解锁,本进程或者其他进程再次使用 F_SETLK 命令访问同一文件则会告知目前此文件已经上锁,加锁进程退出(正常、异常)后会自行解锁,使用此特性可以实现避免程序多次运行、锁定文件防止其他进行访问等操作。如果共享锁或独占锁被其他的锁阻塞,进程将等待直到这个请求能够完成。转载 2023-10-07 20:41:58 · 904 阅读 · 0 评论 -
信号基础知识
信号(signal)是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号)。应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉。进程收到一个信号后,会检查对该信号的处理机制。如果是SIG_IGN,就忽略该信号;如果是SIG_DFT,则会采用系统默认的处理动作,通常是终止进程或忽略该信号;如果给该信号指定了一个处理函数(捕捉),则会中断当前进程正在执行的任务,转而去执行该信号的处理函数,返回后再继续执行被中断的任务。转载 2023-10-07 20:11:06 · 845 阅读 · 0 评论 -
解析IO 多路复用:select、poll、epoll
了解多路复用可以看下这两篇:原创 2023-06-08 22:13:23 · 117 阅读 · 0 评论 -
linux下write()和read()函数详解
最近项目中经常用到多次重复调用读写函数的情况,这篇文章给出了答案,https://www.cnblogs.com/lnlin/p/9492144.html读函数readssize_t read(int fd,void *buf,size_t nbyte)作用:从文件描述符(fildes)相关联的文件里读入nbytes个字节的数据,并把它们放到数据区buf中。 read返回实际读入的字节数,这可能会小于请求的字节数,如果read调用返回0,表示未读入任 ...转载 2021-06-12 16:54:18 · 2092 阅读 · 0 评论 -
top和ps查看线程
在Linux上显示某个进程的线程的几种方式。方法一:PS在ps命令中,“-T”选项可以开启线程查看。下面的命令列出了由进程号为<pid>的进程创建的所有线程。1.$ ps -T -p <pid>方法二: Toptop命令可以实时显示各个线程情况。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux线程。在top运行时,你也可以通过按“H”键将线程查看模式切换为开或关。1.$ top -H要让top输出某个特定进程<转载 2021-05-10 23:54:07 · 8071 阅读 · 0 评论 -
fork()和vfork()的区别
llinux中fork和vfork函数都可以创建进程,但是两者的创建方式是有区别的:1.vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。2.fork要拷贝父进程的进程环境;而vfork则不需要完全拷贝父进程的进程环境,在子进程没有调用exec和exit之前,子进程与父进程共享进程环境,相当于线程的概念,此时父进程阻塞等待。因此:fork:子进程和父进程拥有独立的数据段,堆和栈区,两者完全独转载 2021-05-10 23:25:49 · 292 阅读 · 0 评论 -
[转载]高并发的socket的高性能设计
高性能数据传输系统的框架设计1 引言 随着互联网和物联网的高速发展,使用网络的人数和电子设备的数量急剧增长,其也对互联网后台服务程序提出了更高的性能和并发要求。本文的主要目的是阐述在单机上如何进行高并发、高性能消息传输系统的框架设计,以及该系统的常用技术,但不对其技术细节进行讨论。如您有更好的设计方案和思路,望共分享之![注:此篇用select来讲解,虽在大并发的情况下,epoll拥有更高的效率,但整体设计思路是一致的]首先来看看课本和学习资料上关于处理并发网络编程的三...转载 2021-05-10 23:10:02 · 526 阅读 · 0 评论 -
进程,线程及多线程的概念
1.线程的概念:线程是轻量级的进程,线程与创建它的进程共享代码段、数据段,即共享全局变量,但是线程有自己独立的栈,有自己的函数调用,不然调用会混乱2.多线程的概念? 说起多线程,那么就不得不说什么是线程,而说起线程,又不得不说什么是进程。 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是...转载 2021-05-10 00:16:59 · 286 阅读 · 0 评论 -
另一种内存映射方法--mmap函数
介绍除了标准的文件 IO,例如 open, read, write,内核还提供接口允许应用将文件 map 到内存。使得内存中的一个字节与文件中的一个字节一一对应。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同.转载 2020-08-31 23:07:59 · 554 阅读 · 0 评论 -
进程间通信共享内存使用总结
什么是共享内存?共享内存就是允许两个或多个进程共享一定的存储区。就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC。注:共享内存没有任何的同步与互斥机制,所以要使用信号量来实现对共享内存的存取的同步。共享内存特点和优势当中共享内存的大致原理相信我们可以看明白了,就是让两个进程地址通过页表映射.转载 2020-08-31 22:02:12 · 486 阅读 · 0 评论 -
Linux编程之select
Linux编程之selectselect系统调用的的用途是:在一段指定的时间内,监听用户感兴趣的文件描述符上可读、可写和异常等事件。select 机制的优势为什么会出现select模型?先看一下下面的这句代码:int iResult = recv(s, buffer,1024);这是用来接收数据的,在默认的阻塞模式下的套接字里,recv会阻塞在那里,直到套接字连接上有数据可读,把数据读到buffer里后recv函数才会返回,不然就会一直阻塞在那里。在单线程的程序里出现这种情况会导转载 2020-08-30 15:55:06 · 196 阅读 · 0 评论 -
【转载】Linux多线程编程小结
1.Linux进程与线程进程是资源分配的最小单位,线程是CPU调度的最小单位 这句话的意思,关键是最后一句,线程是CPU调度的最小单位,也就是说,本质上操作系统调度的是线程 而不是进程,因为任何一个进程都包含一个 主线程,所以操作系统是对线程进行调度的,这一点,也 解释了,为什么在 线程中做各种循环执行程序(do..while、for、while)时,程序不会死机了,因为线程本身就是会被CPU循环调度。与进程相比,创建的子线程从主线程那继承了什么? 我们知道父子进程间的继承是...转载 2020-08-30 16:17:18 · 134 阅读 · 0 评论 -
【转载】socket编程常用函数解析
这里以一个socket通信例子讲解socket的函数,server.cpp 是服务器端代码,client.cpp 是客户端代码,要实现的功能是:客户端从服务器读取一个字符串并打印出来。服务器端代码 server.cpp:#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #inclu转载 2020-07-05 22:02:28 · 773 阅读 · 0 评论 -
网络字节序和主机字节序
1、大端、小端字节序考虑一个16位整数,它由2个字节组成。内存中存储这两个字节有两种方法:一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。如下所示:术语“大端”和“小端”表示多个字节值的哪一端(小端或大端)存储在该值的起始地址。遗憾的是,这两种字节序之间没有标准可循,两种格式都有系统使用。比如,Inter x86、ARM核采用的是小端模式,Power PC、MIPS UNI..转载 2020-07-05 22:47:44 · 1636 阅读 · 0 评论 -
shutdown函数:如何优雅地断开TCP连接
调用 close()/closesocket() 函数意味着完全断开连接,即不能发送数据也不能接收数据,这种“生硬”的方式有时候会显得不太“优雅”。图1:close()/closesocket() 断开连接上图演示了两台正在进行双向通信的主机。主机A发送完数据后,单方面调用close()/closesocket() 断开连接,之后主机A、B都不能再接受对方传输的数据。实际上,是完全无法调用与数据收发有关的函数。一般情况下这不会有问题,但有些特殊时刻,需要只断开一条数据传输通道,而保留另一条。.转载 2020-07-05 22:14:07 · 2573 阅读 · 0 评论 -
socket网络编程是如何在TCP协议中的通信的
每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当转载 2020-07-05 22:11:41 · 1421 阅读 · 2 评论 -
socket套接字类
这个世界上有很多种套接字(socket),比如 DARPA Internet 地址(Internet 套接字)、本地节点的路径名(Unix套接字)、CCITT X.25地址(X.25 套接字)等。这里只讲第一种套接字——Internet 套接字,它是最具代表性的,也是最经典最常用的。以后我们提及套接字,指的都是 Internet 套接字。根据数据的传输方式,可以将 Internet 套接字分成两种类型。通过 socket() 函数创建连接时,必须告诉它使用哪种数据传输方式。Internet 套接字其实还有转载 2020-07-05 21:36:39 · 288 阅读 · 1 评论 -
IP地址&端口号
一、IP地址1.什么是IP地址?IP地址是连接在因特网上的主机的标识符2.IP协议的分类?IP协议有两个版本,分别是IPV4,IPV6ps:基本上提到IP地址时,不特指的话,都是指IPV43.IP地址的大小、格式、分类?(1)IP地址的大小:IP地址是一个4字节,32位的整数(2)IP地址的格式:IP地址是一个32位的整数,但是为了我们便于记忆,通常使用“点分十进制”字符串形式来表示IP地址,例如:192.168.0.1,用点分割的每一个数字表示一个字节,范围是0到255(3)IP地转载 2020-07-05 21:21:39 · 12366 阅读 · 0 评论 -
进程间通信posix信号量使用总结
posix信号量分为命名信号量和基于内存的信号量posix命名信号量,使用posix名字表示,可用于线程或进程间同步1.sem_open函数头文件: #include <semaphore.h>函数原型:sem_t *sem_open(const char *name, int oflag, ... /* mode_t mode, unsigned int value ...原创 2020-05-05 14:41:57 · 294 阅读 · 0 评论 -
进程间通信posix消息队列介绍
消息队列可以看做一个消息链表。具有随内核的持续性,即当使用该消息队列的进程结束,或者已关闭该消息队列,该消息队列的消息不会随之消失,只有在内核重新初始化,即计算机重启之后才会消息,因此称为随内核的持续性,这点也是与管道和FIFO的区别。消息队列的另一个特性就是,在某个进程网消息队列写消息之前不需要另外某个进程在该消息队列上等待消息的到达,既不会像管道和FIFO那样,往管道和FIFO中写数据时,如果...原创 2020-05-05 14:42:35 · 910 阅读 · 0 评论 -
【转载】linux函数sync、fsync与fdatasync区别
一、术语解释脏页:linux内核中的概念,因为硬盘的读写速度远赶不上内存的速度,系统就把读写比较频繁的数据事先放到内存中,以提高读写速度,这就叫高速缓存,linux是以页作为高速缓存的单位,当进程修改了高速缓存里的数据时,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到磁盘中去,以保持高速缓存中的数据和磁盘中的数据是一致的。内存映射:内存映射文件,是由一个...转载 2020-05-05 14:42:43 · 612 阅读 · 2 评论 -
【转载】ioctl函数实现及在应用程序中的使用
一、 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下:int ioctl(int fd, ind cmd, …); 其中fd是用户程序打开设备时使用open函数返回的文件标示符,cmd是用户程序对设备的控制命令,至于后面的省略号,那是一...转载 2020-05-02 17:23:26 · 742 阅读 · 0 评论 -
非常好的一篇对linux信号(signal)的解析 (转载)
Linux信号(signal) 机制分析转载至:https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html【摘要】本文分析了Linux内核对于信号的实现机制和应用层的相关处理。首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理。接着分析了内核对于信号的处理流程包括信号的触发/注册/执行及注销等。最后介绍了应...转载 2020-04-06 17:55:18 · 309 阅读 · 0 评论