- 博客(21)
- 收藏
- 关注
原创 基于sqlite3的词典功能
词典功能介绍 实现了客户端通过TCP链接服务器端,然后进行查询单词的功能,服务器端将用户信息和用户查询的历史记录存到数据库中,服务器端词典利用文件IO对词典文件进行查询并将结果发送到客户端。 创建一个sqlite3的数据库 创建 diction.db linux-zs@ubuntu:~/1024/sqlite3_dictionary/test$ sqlite3 diction.db SQLite version 3.8.2 2013-12-06 14:53:30 Enter ".help" for ins
2022-01-07 00:01:49
1370
原创 网络编程(TCP)
并发服务器(TCP)(多线程) 并发服务器工作步骤及特点 与上节并发服务器(TCP)(多进程)相同 代码实现 与上节并发服务器(TCP)(多进程)大体相同,将进程改为线程即可,代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #inclu
2021-11-28 22:16:34
1732
原创 网络编程(TCP)
并发服务器(TCP)(多进程) 并发服务器工作步骤 1.父进程接收连接请求队列的请求; 2.连接成功后创建子进程为客户端服务; 并发服务器特点 可以为多个客户端同时提供服务; 但需要注意的是要及时回收进程,避免出现僵尸进程; 编程实现 客户端 客户端代码与上节循环服务器中客户端代码一致。 服务器端 服务器端主要需要完成的就是连接成功后创建一个子进程为客户端服务,代码示例 while(1){ client_fd = accept(server_fd,(struct sockaddr *)&clie
2021-11-28 21:26:55
1119
原创 网络编程(TCP)
循环服务器 tcp 循环服务器工作步骤 1.服务器从请求连接队列中提取连接请求; 2.服务器从客户端接收数据,直到客户端关闭; 3.继续返回第一步; 循环服务器特点 前一个客户端没有结束,下一个服务器就需要一直等待链接,效率不高。 编程实现 客户端 客户端编程方法实现基本连接功能即可,代码如下 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #inclu
2021-11-28 21:10:26
543
原创 Windows下利用脚本重启软件
Windows下脚本文件是利用了cmd命令来实现的 关闭运行的软件 taskkill /f /im <运行中的程序> 注:一般在Windows下我们会利用文本编辑器编辑好,然后再转换成 .bat文件,这时候需要注意下,里面如果有中文需要将编码格式转换为ANSI格式。 如 taskkill /f /im ShareMouse.exe 运行脚本之前我的应用是运行的 运行脚本文件 运行之后程序退出了 打开需要运行的软件 start <路径+需要运行的.exe> cd C:\Prog
2021-10-29 15:21:40
3951
1
原创 进程(守护进程)
什么是守护进程 守护进程,即通常所说的Daemon进程,是Linux中的后台服务进程,他是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些事的发生。不会因为用户、终端、或者其他的变化而受到影响,那么就必须把这个进程变成一个守护进程。 怎么创建守护进程 1.我们知道子进程运行父进程退出的情况下,子进程会被init收养并转为后台进程,守护进程一般都是授予后台进程,所以第一步就是创建子进程父进程退出,让子进程成为后台进程。 2.利用setsid()创建一个新会话,并让子进程担任会话组
2021-10-18 23:51:02
1108
原创 进程(exec函数族)
上节中我们知道子进程是父进程的一个复制品,子进程执行的程序也是和父进程相同的(fork()之后的程序),那么如果只能依赖父进程的代码,子进程的作用就不是很大了。 有没有什么办法不让子进程执行父进程的代码,而是让子进程执行其他的代码呢?这就用到了exec函数族了。 exec函数族 exec函数族中有这样几个函数: int execl(const char *path,const char *arg,…); int execlp(const char *file,const char *arg,…); int
2021-10-18 20:58:27
321
原创 进程(进程回收)
进程回收 通过上节我们知道子进程退出后如果父进程不及时回收子进程会变成僵尸进程,那么父进程怎么回收已退出的子进程呢? wait()和waitpid()函数 wait()函数 函数原型 pid_t wait( int *status); ret: 成功:已回收进程的pid; 失败:-1; 功能:使用于父进程,等待(阻塞)一个子进程结束或该进程接到了一个指定的信号为止; 如果该父进程没有子进程或子进程已结束,那么wait()会返回-1; 代码 #include<stdio.h> #include
2021-10-14 20:40:34
441
2
原创 进程(父进程、子进程、init进程)
父进程和子进程、init进程之间的关系 通过上节我们知道,子进程是通过fork()函数创建的,相当于父进程的一个复制品,子进程和父进程除了子进程复制了父进程还有什么关系呢? 1.子进程和父进程属于同一进程组,父进程为进程组组长; 2.父进程退出子进程未退出的情况下,子进程会变成孤儿进程有init进程收养并转为后台进程; 3.子进程退出父进程为退出但父进程未及时进行回收,子进程就会成为僵尸进程; 用通俗的方式来讲:子进程和父进程就如同一家公司开了一家子公司一样,虽然在表面上看两家公司是两个独立的公司,但实际内
2021-10-13 21:21:09
4098
2
原创 进程fork()
如何创建进程 平时我们编辑的程序可以利用"if""switch"等进行分支(如下程序) int main(){ if(.....){ .....; }else{ ......; } for(...;....;....){ ........; } return 0; } 但这样一个程序终究执行的只有一个任务,想要多任务编程我们需要再创建一个进程,那么怎样才能创建一个进程呢? fork()函数 我们可以利用fork()函数创建一个新的进程 函数原型:pid_t fork(void); ...
2021-10-12 21:32:25
341
3
原创 获取系统时间并写入文件
功能说明 利用time函数每隔1s获取系统当前时间,并写入到time.txt中。 代码 #include<stdio.h> #include"dirent.h" #include<time.h> int main() { int i = 0; FILE* p; time_t t; p = fopen("time.txt", "w+");//打开文件为读写状态 while (1) { time(&t);//获取系统当前时间 fprintf(p, "time:
2021-09-27 16:56:35
1713
1
原创 访问目录和文件属性
opendir 用来打开一个目录文件 DIR *opendir(const char *name); DIR是用来描述一个打开的目录文件的结构体类型,成功返回目录流指针,出错时返回NULL。 readdir 用来读取目录流中的内容 struct dirent *readdir(DIR *dirp); struct dirent 是用来描述目录流中一个目录的结构体 struct dirent { ino_t d_ino; /* inode nu
2021-09-24 20:29:51
328
2
原创 快速排序的实现
快速排序原理 快速排序的应用原理是:假定第一个元素为基准点,经过比较只够将数据中比基准元素大的放到基准元素右边,小的放到左边,按照这个方法推导直至数据有序。 其实不难发现,这样的操作方法有递归的特性。 实现代码 建立顺序表用来存储数据 qsort.h #ifndef _QSORT_H_ #define _QSORT_H_ typedef int data_t; typedef struct{ //建立的顺序表 data_t *data; int maxlen; }lin,*linlist; linl
2021-09-13 21:19:38
262
2
原创 哈希表(链地址法)
链地址法原理 具体实现代码 hash.h #ifndef _HASH_H_ #define _HASH_H_ typedef int data_t; typedef struct node{ data_t key; data_t value; struct node * next; }link,*linklist; typedef struct{ linklist h; int maxlen; }hash,*linhash; linhash hash_creart(int len);
2021-09-09 08:53:23
1039
1
原创 哈希表(开放地址法)
实现原理 当发生冲突时,在H(key)的前后找一个空闲单元来存放冲突的记录 实现代码 hash.h #ifndef _HASH_H_ #define _HASH_H_ typedef int data_t; typedef struct { data_t *data; int maxlen; }hash,*linhash; linhash hash_creart(int len); //创建哈希表 int hash_insert(linhash H,data_t data,int maxpr
2021-09-08 23:48:01
860
原创 查找的几种方法(顺序查找、折半查找)
顺序查找 是将表中记录(R1 R2……Rn)按其序号存储于一维数组空间,设给定值为k,在表(R1 R2……Rn)中,从R(n)开始,n–查找R(n)=k的记录; (而言之就是:一个一个找,知道找到为止); 优点:简单易懂; 缺点:效率很低; 具体代码如下 #include<stdio.h> #include<string.h> #include<stdlib.h> typedef int data_t; typedef struct{ data_t *data;
2021-09-03 21:35:16
1089
1
原创 二叉树的创建和遍历
二叉树示意图 # 二叉树的创建 二叉树具有递归特性,所以利用递归的方式实现二叉树的创建。(使用链式存储结构) /*利用先序遍历的结构进行递归*/ linktree tree_creart(){ data_s ch; linktree T; scanf("%c",&ch); if(ch == '#'){ //输入‘#’代表当前节点为空,即说明某个分支没有 return NULL; } T = (linktree)malloc(sizeof(tree)); if(T == NUL
2021-09-02 15:07:08
252
原创 球钟(利用栈和队列实现)
什么是球钟 球钟是一个利用球的移动来记录时间的简单装置 它有三个可以容纳若干个球的指示器:分钟指示器,五分钟指示器,小时指示器 例如:分钟指示器中有2个球,五分钟指示器中有6个球,小时指示器中有5个球,则时间为5:32 工作原理 每过一分钟,球钟就会从球队列的队首取出一个球放入分钟指示器,分钟指示器最多可容纳4个球。 当放入第五个球时,在分钟指示器的4个球就会按照他们被放入时的相反顺序加入球队列的队尾。而第五个球就会进入五分钟指示器。 按此类推,五分钟指示器最多可放11个球,小时指示器最多可放11个球。 当
2021-08-29 14:53:37
452
1
原创 顺序栈的实现
顺序栈 利用顺序存储创建的栈; 和顺序表相同,只是将顺序表添加了一些限制; 栈的特点:先入后出,后入先出; 在.h文件中搭建数据基本结构 #include<stdio.h> typedef int data_t; typedef struct{ data_t *data; //定义存储数据的指针 int maxlen; //定义能够存储数据的数量 int top; //指向栈顶 }sqstack,*linstack; /*一些功能函数*/ linstack creart(int len
2021-08-28 17:32:04
271
1
原创 单链表排序(交换节点)
单链表排序(移动节点) 单链表排序利用了选择排序的方式; 创建一个单链表结构体 typedef int data_t;//为了能适应存储其他类型数据,可以将int换成其他数据类型而不通用一个一个更改程序里的了 typedef struct node{ data_t a;//链表里存的数据 struct node *next;//指向下一个节点 }linknode,* linklist;//创建结构体变量和指针 单链表节点的结构形式出来啦,接下来我们就按图施工,创建链表吧 linklist link_
2021-08-19 08:44:00
2487
1
原创 单链表逆序显示
#include<stdio.h> #include<stdlib.h> typedef int datatype; typedef struct node{ datatype data; struct node * next; }linknode, *linknode_p; linknode * create(void){ linknode * L = NULL; L = (linknode *)malloc(sizeof(linknode)); if(NULL == L){ pr
2020-08-28 08:24:15
145
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅