- 博客(26)
- 收藏
- 关注
原创 十七、TCP编程
函数是网络编程中用于将套接字(socket)与特定的IP地址和端口绑定的关键步骤,常用于服务端设置监听地址。提取连接:从监听套接字的已完成连接队列(已完成三次握手)中取出一个客户端连接。生成新套接字:返回的已连接套接字与客户端一一对应,原监听套接字继续接受其他连接。成功:返回一个新的已连接套接字描述符(非负整数),专门用于与客户端通信。成功:返回一个非负整数(套接字文件描述符),后续操作(如。,套接字进入已连接状态(TCP)或设置默认地址(UDP)。
2025-04-12 20:08:37
658
原创 十六、Linus网络编程基础
1、Linux 网络的历史发展1、Linux 网络的历史发展早期阶段(1991–1995)1991年:Linus Torvalds 发布 Linux 内核的初始版本(0.01),此时内核不支持网络功能,仅是一个单机操作系统。1992年:受 BSD 套接字(BSD Sockets)启发,Linux 开始集成网络子系统,目标是兼容 TCP/IP 协议栈。首个网络实现由开发者 Ross Biro 贡献,但功能有限。
2025-04-12 17:42:26
576
原创 十六、条件变量和信号量
互斥量:保护一块共享数据。当条件满足,通知阻塞的线程开始工作。将已经上锁的mutex解锁。该函数解除阻塞,对互斥锁加锁。唤醒至少一个阻塞在条件变量上的线程。使用条件变量实现生产者,消费者模型。唤醒全部阻塞在条件变量上的线程。使用条件变量+互斥量。条件不满足,阻塞线程。阻塞等待一个条件变量。限时等待一个条件变量。加锁失败,不阻塞,直接发牛。不是什么时候都能阻塞线程。,但是条件变量能够阻塞线程。conditon 条件。
2025-04-07 21:20:06
892
原创 十五、互斥锁、原子操作、死锁和读写锁
/阻塞 --mutex = 0。如何解决: 让线程按照一定的顺序去访问共享资源-在访问其他锁的时候,需要先将自己的锁解开 --try_lock。线程A加读锁成功,又来了B线程加写锁阻塞,又来了C线程加读锁阻塞。线程A加读锁成功,又来了三个线程,做读操作,可以加锁成功。线程A加写锁成功,又来了三个线程,做读操作,三个线程阻塞。线程A持有读锁,然后线程B请求写锁,然后线程C请求读锁。线程1访问共享资源B,对B锁加锁-线程1阻塞在B锁上。线程A持有写锁,然后线程B请求读锁,然后线程C请求写锁。
2025-04-07 20:40:33
662
原创 十四、守护进程和线程的概念、创建以及分离属性
后台服务进程独立于控制终端周期性执行某任务不受用户登录注销影响一般采用以d结尾的名字(服务)进程的组长:组里边的第一进程。进程组的ID==进程中的组长的ID。进程中组长的选择:进程中的第一个进程。进程组ID的设定进程组的ID就是组长的进程ID。创建一个会话注意事项:不能是进程组长。创建会话的进程成为新进程组的组长。有些lInux版本需要root权限执行此操作。创建出的新会话会丢弃原有的控制终端。一般步骤;fork ,父亲死,儿子执行创建会话操作(setid)。
2025-03-30 21:27:23
692
原创 十二、信号
信号的接收(接收信号进程) : pause()、 sleep、 while(1)信号的发送(发送信号进程):kill、raise、alarm。:通知进程异步事件(如用户输入、硬件异常、其他进程请求等)。信号的处理(接收信号进程) :signal。优先级高于普通进程执行,会中断当前操作。轻量级,仅传递信号编号(无数据内容)。子进程状态变化(终止/暂停)终端断开或控制进程结束。不可被捕获、阻塞或忽略。内存非法访问(段错误)
2025-03-26 21:45:20
199
原创 十一、共享内存
的IPC机制,但需配合同步机制(如信号量)避免竞态条件。共享内存允许多个进程访问同一块物理内存区域,是。1.共享内存(Shared Memory)1.共享内存(Shared Memory):数据直接在内存中读写,无需内核中转。:适合高频数据交换(如视频流处理)。:随进程分离或显式删除而释放。:需开发者自行实现锁或信号量。:直接操作内存指针。
2025-03-26 20:43:00
913
原创 十、消息队列
消息按先进先出(FIFO)顺序处理,支持优先级设置。消息队列是内核维护的通信机制,允许进程通过发送和接收。:保留消息的独立性,接收方按消息单位读取。:消息队列在进程结束后仍存在,需显式删除。:发送者与接收者无需同时运行。
2025-03-26 20:23:57
250
原创 九、进程间的通信、有名管道和无名管道
无数据:写端被全部关闭,read返回0,相当于读文件到了尾部。没有全部关闭,read阻塞。读端全部关闭:管道破裂,进程被终止。读端没全部关闭:缓冲区写满了,write阻塞。缓冲区没满,write继续写,直到写满,阻塞。有数据:read(fd[1]) 正常读,返回读出的字节数。默认读写两端都阻塞,设置读端为非阻塞pipe(fd)。参数:管道文件文件名,权限,创建的文件权限仍然和umask有关系。3、父子进程通过关闭不需要的文件描述符,确定通信方向。读端,写端,对应两个文件描述符。复制文件描述符-dup。
2025-03-26 18:54:06
529
原创 六、字符串函数
连接前,两串均以 '\0' 结束,连接后,串 1的 '\0' 取消,新串最后加 ‘\0’比较规则:对两串从左向右逐个字符比较(ASCII),直到遇到不同字符或 '\0'为止。strncpy(p,p1,n) ,复制指定长度字符串。strncat(p,p1,n),附加指定长度字符串。strncmp(p,p1,n),比较指定长度字符串。格式:stracat(字符数组1,字符数组2)strchr(p,c),在字符串中查找指定字符。格式:strcpy(字符串1,字符串2);格式:strcmp(字符串1,字符串2)
2025-03-18 21:15:48
374
原创 五、常见的数组
等价于:a[0]=0;等价于:a[0]=6;数组是具有一定顺序关系的若干个变量的集合,组成数组的各个变量称为数组的元素。它重复的走访过要排序的数列,一次比较两个元素,如果顺序错误就交换。编译时分配连续的内存,内存字节数=数组维数*sizeof(元素数据类型)数组中各元素的数据类型要求相同,用数组名和下标确定,数组可以是一维的,也可。所谓一维数组是指只有一个下标的数组,它在计算机的内存中是连续存储的。二维数组a是由 三个元素组成 a[0]、a[1]、a[2]每个元素a[i] 由包含2个元素的一维数组组成。
2025-03-18 20:40:31
239
原创 八、孤儿进程、僵尸进程、进程回收、vfork和进程退出
对于三个终止函数(exit, _exit和 _ Exit),实现这一点的方法是,将其退出状态(exit status)作为参数传送给函数,在异常终止情况下,内核(不是进程本身)产生一个指示其异常终止原因的终止状态(termination status)。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。一个比较特殊的状态,当进程退出父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。1.孤儿进程和僵尸进程。1.孤儿进程和僵尸进程。
2025-03-18 17:32:55
227
原创 七、进程中常用的指令函数族以及数据共享
1.ps和kill指令1.ps和kill指令查看进程信息部分参数:a : 显示现行终端机下的所有程序,包括其他用户的程序u: 以用户为主的格式来显示程序状况x: 显示所有程序,不以终端机来区分ajx向指定的进程发送信号kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。参数:-a:当处理当前进程时,不限制命令名和进程号的对应关系;
2025-03-18 15:16:09
469
原创 六、Linus进程
fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。并发不是真正意义上的“同时进行”,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行。作用:通过复制当前进程(父进程)创建一个新进程(子进程)。
2025-03-17 22:12:12
734
原创 五、三类读写函数
gets()时不能指定缓存的长度,这样就可能造成缓存越界(如若该行长于缓存长度),写到缓存之后的存储空 间中,从而产生不可预料的后果;gets()与fgets()的另一个区别是:gets()并不将新行符存入缓存中, fgets 将新行符存入缓存中;puts()与fputs()的另一个区别是: puts 输出时会添加一个新行符,fputs不会添加;返回值:若成功则为s(缓存的地址),若已处文件尾端或出错则为null。用于取得当前的文件位置,调用成功则为当前文件位置指示,若出错则为-1L;
2025-03-13 22:02:12
388
原创 四、文件IO、标准IO、fopen、fclose、fwrite以及fread函数
fwrite()──从buffer开始,一次输出size个字节,重复count次,并将输出的数据存放到fp所指向的文件 中。需要注意的是该函数不是重定位文件指针,而是重定位文件内部的指针,让指向文件内部数据的指针移到文件中我 们感兴趣的数据上,重定位主要是这个目的。把fp指针移动到离文件当前位置100字节处;at+:打开文本文件,可读写,写的数据加在文本末尾 ab+:打开二进制文件,可读写,写的数据加在文件末尾。a+:附加方式打开可读写,不存在建立该文件,存在写入的数据加到文件尾,EOF符不保留。
2025-03-12 21:31:24
548
原创 三、输入输出函数
功能:按指定格式从键盘读入数据,存入地址表指定存储单元中,并按回车键结束。格式说明: % [修饰符]格式字符,用于指定输出格式。功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加。地址表:变量的地址,常用取地址运算符。返回值:正常,返回输入数据个数。功能:按指定格式向显示器输出数据。功能:向显示器输出字符串(输出完,换行)格式:printf(”格式控制符“,输出表)返回值:正常,返回读取的代码值;总结:输入数据的时候,遇到以下情况认为该函数结束。参数:c为字符常量,变量或者表达式。
2025-03-11 22:09:14
669
原创 二、数据类型、变量、常量和运算符介绍
未初始化变量:局部变量未初始化时值为随机数,可能导致程序错误。变量是程序运行时可以修改的存储单元,需先声明类型后使用。常量是程序运行中不可修改的值。局部变量:在函数或代码块内声明,仅在其范围内有效。全局变量:在函数外声明,整个程序可见。隐式转换:小类型向大类型自动转换(如。显式转换:强制类型转换,如。
2025-03-11 21:21:09
837
原创 三、Write、Read、lseek函数、main函数以及cp指令的实现
实际上,主函数的参数值是从操作系统命令行上获得的。argc: 参数表示命令行中参数的个数(注意文本名本身也是一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。C语言规定了主函数的参数只能有两个,一个是argc,一个是argv,并且,argc只能是整数,第二个必须是指向字符串的指针数组。但是应该特别注意的是,main的两个形参和命令行中的参数在位置上不是一一对应的。write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。*buf: 写入的数据的首地址。
2025-03-10 20:02:14
480
原创 二、Linus中的open与close函数
O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。grep -nr "xxxx"./ pathname:文件的路径名,如果只写文件名,就默认当前目录,如果在文件名加上路径,就按照绝对路径来打开文件。O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。O_EXCL 表示如果要创建的文件已存在,则出错,同时返回-1,并且修改errno 的值。写(w):修改文件内容或在目录中创建/删除文件。-:文件类型(- 表示普通文件,d 表示目录)。
2025-03-07 16:19:43
955
原创 一、Linus目录与文件操作
其次Linux命令操作的目的 Windows采用的命令:DOS命令 Linux采用的命令:Shell命令 问:我们首先需要搞清楚,采用这些命令,我们要做什么?yx:复制若干行,x代表行数,输入2,就是复制当前行和它下面的两行(总共三行), 复制的 位置由光标所在位置决定。2.文本输入模式:按i进入 进入文本输入模式,即可编辑代码,注意只能键盘操作, 鼠标不行。vi和vim的区别:vim是vi的升级版,基础功能两者一致,不过在嵌入式开发板中。vi是一种方便的代码编辑器,Linux系统一般是自带的。
2025-03-07 15:11:38
230
原创 一、c语言的介绍
较单一的功能来说,支持自动补全、语法提示和语法检查,除此之外,还自带有许多现成。的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用即可。开始进入其他操作系统,并且很快在各类大,中,小和微型计算机。上得到了广泛的使用,成为了当代最优秀的程序设计语言之一。序书写自由,主要用小写字母表示,压缩了一切不必要的成分。就是分析出解决问题所需要。类型更为丰富,可以实现其他高级语言难以实现的运算。把括号,赋值,逗号等作为运算符处理。开发环境,免费、开源、跨平台,相比较。语言简洁,紧凑,使用方便,灵活。
2025-03-05 17:28:55
360
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人