- 博客(371)
- 收藏
- 关注
原创 linux编程安防监控项目
SecureCRT串口配置:putty xshell。好,到这里咱们基本的环境配置就OK了。2.4.5 本地回环可能遇到的问题。2.4.3 重启tftp服务器。2.4.1 修改配置文件。2.4.4 本地回环测试。
2023-08-09 13:19:28
318
原创 linux应用开发-在线词典项目
服务器端将用户信息和历史记录保存在数据库中。客户端输入用户名和密码,服务器端在数据库中查找、匹配,返回结果。根据客户端输入的单词在字典文件中搜索。分析服务器端和客户端流程。定义数据库中表的结构。
2023-08-08 19:11:40
264
原创 linux-数据库开发之Sqlite3
1, 数据库的安装2, 数据库命令:1)系统命令 , 都以'.'开头.exit.quit.table 查看表.schema 查看表的结构2)sql语句, 都以‘;
2023-08-07 22:33:47
290
原创 linux网络编程-广播、多播、套接字
前面介绍的数据包发送方式只有一个接受方,称为单播如果同时发给局域网中的所有主机,称为广播只有用户数据报(使用UDP协议)套接字才能广播以192.168.1.0 (255.255.255.0) 网段为例,最大的主机地址192.168.1.255代表该网段的广播地址发到该地址的数据包被所有的主机接收255.255.255.255在所有网段中都代表广播地址创建用户数据报套接字缺省创建的套接字不允许广播数据包,需要设置属性setsockopt可以设置套接字属性接收方地址指定为广播地址指定端口信息
2023-08-07 18:16:55
576
原创 linux网络编程-网络分析测试工具、封包、IP和TCP头
IPv4 中使用 gethostbyname() 函数完成主机名到地址解析,这个函数仅仅支持 IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储 IPv4 地址的空间。IPv6 中引入了 getaddrinfo()的新 API,它是协议无关的,既可用于 IPv4 也可用于 IPv6。gethostbyname() 根据主机名取得主机信息 endhostent()optname指定控制的方式(选项的名称),我们下面详细解释。3. SYN,,ACK, FIN 等标志符号应该写上|
2023-08-07 15:58:53
383
原创 linux网络编程-多路IO复用
阻塞I/O: 最常用非阻塞I/O: 可防止进程阻塞在I/O操作上,需要轮询I/O 多路复用: 允许同时对多个I/O进行控制信号驱动I/O:一种异步通信模型。
2023-08-07 13:35:46
163
原创 llinux网络编程-UDP编程
接收数据:`recvfrom()`函数用于从套接字接收数据。- 获取发送方地址:`recvfrom()`函数还可以获取发送方的地址信息。使用`recvfrom()`函数可以实现对套接字的数据接收操作,并获取发送方的地址信息,适用于网络通信中需要接收数据并处理的场景。函数`recvfrom()`用于从一个已连接或未连接的套接字接收数据,并将数据存储到指定的缓冲区中。- `addrlen`:发送方地址缓冲区的大小,接收后会被修改为实际地址大小。- `src_addr`:发送方地址的缓冲区指针。
2023-08-06 18:51:25
322
原创 llinux网络编程-并发服务器(多进程)
每个连接都会创建一个新的线程,这些线程共享相同的内存空间,可以直接访问共享的数据。- 多进程并发服务器:使用多个独立的进程来处理并发连接请求。每个连接都会创建一个新的进程,这些进程之间是相互独立的,通过进程间通信来传递数据。总的来说,多进程并发服务器适用于计算密集型任务和对异常处理要求较高的场景,而多线程并发服务器适用于连接密集型任务和对资源利用效率要求较高的场景。- 对于异常处理要求较高的场景,一个进程的崩溃不会影响到其他连接的处理。- 对于资源的高效利用要求较高的场景,线程的创建和销毁开销相对较小。
2023-08-06 13:03:42
95
原创 llinux网络编程-网络编程API函数
如果是IPV6的编程,要使用struct sockddr_in6结构体(详细情况请参考man 7 ipv6),通常更通用的方法可以通过struct sockaddr_storage来编程。sockfd: 经过前面socket()创建并通过bind(),listen()设置过的fd。addr: struct sockaddr的结构体变量的地址。sockfd: 通过socket()函数拿到的fd。sockfd: 通过socket()函数拿到的fd。sockfd: 通过socket()函数拿到的fd。
2023-08-05 21:13:27
103
原创 llinux网络编程-网络编程的预备知识、TCP网络编程
提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。cp: 点分形式的IP地址,结果是32位整数(内部包含了字节序的转换,默认是网络字节序的模式)mobileIPV6: local IP(本地注册的IP),roam IP(漫游IP)局域网IP: 192.XXX.XXX.XXX 10.XXX.XXX.XXX。组播IP: 224.XXX.XXX.XXX~239.xxx.xxx.xxx。
2023-08-05 18:56:44
88
原创 llinux网络编程-网络发展历史和分层、TCP/UDP特点
Internet—“冷战”的产物1957 年 10 月和 11 月,前苏联先后有两颗“Sputnik”卫星上天1958 年美国总统艾森豪威尔向美国国会提出建立 DARPA (Defense Advanced Research Project Agency),即国防部高级研究计划署,简称 ARPA。
2023-08-05 18:17:25
112
原创 进程、线程和进程间通信-信号集、信号的阻塞
有时候不希望在接到信号时就立即停止当前执行,去处理信号,同时也不希望忽略该信号,而是延时一段时间去调用信号处理函数。信号递达(Delivery ):实际信号执行的处理过程(3种状态:忽略,执行默认动作,捕获)信号的阻塞概念:信号的”阻塞“是一个开关动作,指的是阻止信号被处理,但不是阻止信号产生。功能:将进程的屏蔽字替换为由参数sigmask给出的信号集,然后挂起进程的执行。1如果信号的默认处理动作是终止进程,则进程终止,pause函数么有机会返回。
2023-08-05 16:46:35
163
原创 进程、线程和进程间通信-信号捕捉
ITIMER_PROF:进程在用户模式(即程序执行时)和核心模式(即进程调度用时)均计算时间。ITIMER_PROF:进程在用户模式(即程序执行时)和核心模式(即进程调度用时)均计算时间。SIG_IGN 代表忽略信号;SA_SIGINFO:使用 sa_sigaction 成员而不是 sa_handler 作为信号处理函数。sa_sigaction: 另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。
2023-08-05 11:52:49
196
原创 进程、线程和进程间通信-信号
信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式 linux内核通过信号通知用户进程,不同的信号类型代表不同的事件Linux对早期的unix信号机制进行了扩展。
2023-08-05 10:12:42
128
原创 进程、线程和进程间通信-内存映射
功能:创建共享内存映射函数返回值:成功返回创建的映射区首地址,失败返回MAP_FAILED( ((void *) -1) ),设置errno值参数说明:addr:指定要映射的内存地址,一般设置为 NULL 让操作系统自动选择合适的内存地址。length:必须>0。映射地址空间的字节数,它从被映射文件开头 offset 个字节开始算起。prot:指定共享内存的访问权限。
2023-08-05 01:05:33
227
原创 进程、线程和进程间通信-进程间通讯
对于以只写方式(O_WRONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_WRONLY),open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;如果open调用是非阻塞的(即第二个参数为O_WRONLY | O_NONBLOCK),open总会立即返回,但如果没有其他进程以只读方式打开同一个FIFO文件,open调用将返回-1,并且FIFO也不会被打开。成功时返回0,失败时返回EOF path 创建的管道文件路径 mode 管道文件的权限,如0666。
2023-08-04 23:33:23
188
原创 进程、线程和进程间通信-线程池概念和实现
我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设。编译的时候不加-g,无法通过行号打断点,gdb调试会报没有符号表被读取。2 线程池工作线程,它是任务队列任务的消费者,等待新任务的信号。通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合。1 任务队列,存储需要处理的任务,由工作线程来处理这些任务。,使用线程池可以降低频繁创建和销毁线程所带来的开销,on:其他线程会暂停。任务处理时间比较短的时候这个好处非常显著。解决:检查函数的参数,添加对应的参数。
2023-08-04 22:10:59
113
原创 进程、线程和进程间通信-线程-条件变量
在某些情况下,头部指针是必需的,因为它用于指向链表的起始位置,方便对整个链表的操作。例如,在双向链表中,头部指针通常用于指向链表的第一个节点,这样可以方便地在头部插入新节点。例如,如果只需要对链表进行顺序访问,不需要在头部插入或删除节点,那么不使用头部指针也是可行的。2 如果pthread_cond_signal或者pthread_cond_broadcast 早于 pthread_cond_wait ,则有可能会丢失信号。链表不一定需要头部指针,具体是否需要头部指针取决于链表的设计和使用场景。
2023-08-04 20:49:03
141
原创 进程、线程和进程间通信-线程互斥
临界资源一次只允许一个任务(进程、线程)访问的共享资源临界区 访问临界资源的代码互斥机制 mutex互斥锁 任务访问临界资源前申请锁,访问完后释放锁。
2023-08-04 18:45:59
166
原创 进程、线程和进程间通信-线程取消
意义:随时杀掉一个线程注意:线程的取消要有取消点才可以,不是说取消就取消,线程的取消点主要是阻塞的系统调用杀死一个线程运行段错误调试:可以使用gdb调试使用gdb 运行代码,gdb ./youapp(gdb) run等待出现Thread 1 "pcancel" received signal SIGSEGV, Segmentation fault.输入命令bt(打印调用栈)(gdb) bt确定段错误位置是pcancel.c21行如果没有取消点,手动设置一个。
2023-08-04 15:11:53
111
原创 进程、线程和进程间通信-线程回收
查看运行线程命令ps -eLf|grep ***(线程名称)对于一个默认属性的线程 A 来说,线程占用的资源并不会因为执行结束而得到释放成功返回0,失败时返回错误码thread 要回收的线程对象调用线程阻塞直到thread结束*retval 接收线程thread的返回值注意:pthread_join 是阻塞函数,如果回收的线程没有结束,则一直等待编译错误:错误类型:未知的类型pthead_t错误可能:1拼写错误,2对应的头文件没有包含。
2023-08-04 10:32:56
92
原创 进程、线程和进程间通信-守护进程
由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。进程组(Process Group): 进程集合,每个进程组有一个组长(Leader),其进程 ID 就是该进程组 ID。成功:返回调用进程的会话ID;
2023-08-04 10:32:16
130
原创 进程、线程和进程间通信-进程基础2
背景:fork创建进程之后,子进程和父进程执行相同的代码,但是在实际开发当中,我们希望父子进程执行不同的代码。作用:执行指定的程序进程调用exec函数族执行某个程序进程当前内容被指定的程序替换实现让父子进程执行不同的程序父进程创建子进程子进程调用exec函数族 父进程不受影响。
2023-08-03 19:29:16
101
原创 进程、线程和进程间通信-进程基础
需要注意的是,`exit()`函数会立即终止程序的执行,不会执行后续的代码,包括`main()`函数中的`return`语句。pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。函数的返回值是被等待的子进程的进程ID。
2023-08-03 18:57:22
172
原创 文件IO-库
或者使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的动态库目录。添加/etc/ld.so.conf.d/*.conf文件,执行ldconfig刷新。Windows和Linux下库文件的格式不兼容 Linux下包含静态库和共享库。1 . 编写库文件代码,编译为.o 目标文件。gcc -o 目标文件 源码.c -L路径 -lxxxx。gcc -o 目标文件 源码.c -L路径 -lxxxx。编译test.c 并链接共享库libcommon.so。
2023-08-03 16:44:38
92
原创 文件IO-文件属性、目录操作
使用文件描述符,要配合open函数使用。struct dirent是用来描述目录流中一个目录项的结构体类型。包含成员char d_name[256] 参考帮助文档。DIR是用来描述一个打开的目录文件的结构体类型。成功时返回目录流指针;成功时返回目录流dirp中下一个目录项;出错或到末尾时时返回NULL。
2023-08-03 14:45:50
76
原创 文件IO-系统IO
上述代码中,我们使用`fopen`函数打开源文件和目标文件,并以读取模式`"r"`打开源文件,以写入模式`"w"`打开目标文件。创建文件时第三个参数指定新文件的权限,(只有在建立新文件时有效)此外真正建文件时的权限会受到umask 值影响,实际权限是mode-umaks。在实际操作中,您可以根据需要选择合适的文件打开模式,并在打开文件后进行相应的读写操作。O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限。O_TRUNC:如文件已经存在,那么打开文件时先删除文件中原有数据。
2023-08-03 13:57:47
187
原创 文件IO-格式化输入输出
* 一年中的第几天,范围从 0 到 365 *//* 一月中的第几天,范围从 1 到 31 *//* 一周中的第几天,范围从 0 到 6 *//* 月份,范围从 0 到 11 *//* 秒,范围从 0 到 59 *//* 分,范围从 0 到 59 */表示类型不匹配 期望的是int但是参数传的是time_t。
2023-08-03 12:15:40
126
原创 文件IO-文件流的刷新和定位
fseek 参数whence参数:SEEK_SET/SEEK_CUR/SEEK_END。2.rewind(fp) 相当于 fseek(fp,0,SEEK_SET);SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量。SEEK_SET 从距文件开头 offset 位移量为新的读写位置。SEEK_CUR:以目前的读写位置往后增加 offset 个位移量。1.文件的打开使用a模式 fseek无效。offset参数:偏移量,可正可负。将流缓冲区中的数据写入实际的文件。
2023-08-03 11:44:06
142
原创 文件IO-二进制读写
计算机内码概念:文本符号在计算机内部的编码(计算机内部只能存储数字0101001....,所以所有符号都要编码)文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。void *ptr 写文件的内容的位置指针。void *ptr 读取内容放的位置指针。size_t size 读取的块大小。存储的格式不同:文本文件只能存储文本。FILE *fp 读取的文件指针。FILE *fp 要写的文件指针。size_t size 写的块大小。size_t n 读取的个数。size_t n 写的个数。
2023-08-03 10:40:03
85
原创 标准IO的字符输入和输出
/宏成功时返回读取的字符;若到文件末尾或出错时返回EOF(-1),getchar()等同于fgetc(stdin)getc和fgetc区别是一个是宏一个是函数注意事项:1函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。2 tdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)3 打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置!4 调用getchar会阻塞,等待你的键盘输入。
2023-08-03 09:57:01
96
原创 文件的打开和关闭
perror和strerror 功能:打印系统的错误描述(注意:是系统错误,不是你自己代码错误)解决方法:如果是系统变量用include 头文件,如果是你自己的,自己手动定义。以只写方式打开文件,若文件存在则文件长度清为0。以只写方式打开文件,若文件不存在则创建;以只读方式打开文件,文件必须存在。以读写方式打开文件,文件必须存在。以读写方式打开文件,其他同”w”。以读写方式打开文件。“r+” 或 ”r+b”“w+” 或 “w+b”“a+” 或 “a+b”“w” 或 “wb”“a” 或 “ab”
2023-08-02 21:11:19
150
原创 文件I/O
标准I/O由ANSI C标准定义 主流操作系统上都实现了C库 标准I/O通过缓冲机制减少系统调用,实现更高的效率。如果我们把系统调用封装成库函数就可以起到隔离的作用,提供程序的可移植性。为了减少操作IO设备的次数,提高运行效率,在内存里面设置的缓冲区,I input 输入设备 比如键盘鼠标都是Input设备。Printf就是库函数然后调用了系统调用才在显示器上显示字符。就是数据的流,在程序中就是一个结构体。优盘,网口,既是输入也是输出。Windows是\r\n。字符设备文件 c。
2023-08-02 00:10:49
89
原创 数据结构-排序
稳定排序和非稳定排序设文件f=(R1……Ri……Rj……Rn)中记录Ri、Rj(i≠j,i、j=1……n)的key相等,即Ki=Kj。若在排序前Ri领先于Rj,排序后Ri仍领先于Rj,则称这种排序是稳定的,其含义是它没有破坏原本已有序的次序。内排序和外排序若待排文件f在计算机的内存储器中,且排序过程也在内存中进行,称这种排序为内排序。若排序中的文件存入外存储器,排序过程借助于内外存数据交换(或归并)来完成,则称这种排序为外排序。
2023-08-01 23:43:49
212
原创 数据结构-哈希表
理想的查找方法是:对给定的k,不经任何比较便能获取所需的记录,其查找的时间复杂度为常数级O(C)。这就要求在建立记录表的时候,确定记录的key与其存储地址之间的关系f,即使key与记录的存放地址H相对应:当要查找key=k的记录时,通过关系f就可得到相应记录的地址而获取记录,从而免去了key的比较过程。这个关系f就是所谓的Hash函数(或称散列函数、杂凑函数),记为H(key)。它实际上是一个地址映象函数,其自变量为记录的key,函数值为记录的存储地址(或称Hash地址)。
2023-08-01 23:12:43
113
原创 数据结构-查找
设记录表L=(R1 R2……Rn),其中Ri(l≤i≤n)为记录,对给定的某个值k,在表L中确定key=k的记录的过程,称为查找。若表L中存在一个记录Ri的key=k,记为Ri.key=k,则查找成功,返回该记录在表L中的序号i(或Ri 的地址),否则(查找失败)返回0(或空地址Null)。
2023-08-01 22:30:04
104
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅