Linux
C++有点难
记录,总结
展开
-
TCP通信端口复用demo
server.c:#include <stdio.h>#include <ctype.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>#include <string.h>int main(int argc, char *argv[]) { // 创建socket int lfd = socket(PF_INET, SOCK_S原创 2021-06-01 09:54:22 · 413 阅读 · 1 评论 -
多进程的回射服务器
server_thread.c:#include <stdio.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthread.h>struct sockInfo{ int fd;//通信的套接字 struct sockaddr_in addr; pthrea原创 2021-05-29 11:33:47 · 131 阅读 · 0 评论 -
Python的一个小网页练习
首先创建一个gothonweb的文件夹,里面的文件结构如下:其中index.html:<html> <head> <title>Gothons Of Planet Percal #25</title> </head><body>{% if greeting %} I just wanted to say <em style ="color: rgb(128, 109, 0);原创 2021-05-09 15:04:44 · 177 阅读 · 0 评论 -
基于多进程的回射服务器改进
主要的改进就是在服务器端的程序中加入了对子进程退出之后的其资源的回收,并且处理了一个accept()函数的一个报错。详见注释server_process.c:#include <stdio.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <signal.h>#include <wait原创 2021-05-09 11:32:14 · 116 阅读 · 0 评论 -
基于多进程的回射服务器
详见注释:server_process.c:#include <stdio.h>#include <arpa/inet.h>#include <unistd.h>#include <stdlib.h>#include <string.h>int main(){ //创建socket int lfd = socket(PF_INET, SOCK_STREAM,0); if(lfd == -1){原创 2021-05-08 21:43:19 · 100 阅读 · 0 评论 -
Linux网络编程之字节序的API
常用的主要有四个函数,详见代码:/* 网络通信中一般都要将主机字节学转换成网络字节序, 另外一段获得数据以后根据自己的情况来决定是否转换*/#include <stdio.h>#include <arpa/inet.h>int main(){ //htons 转换端口 unsigned short a = 0x0102; unsigned short b = htons(a); printf("%0x\n",a);原创 2021-03-13 11:43:46 · 115 阅读 · 0 评论 -
Linux网络编程之字节序
首先字节序是针对一个一个字节来说的,一个字节以内的话是不涉及字节序的问题的。这里可以类比:古汉语的行文顺序是从右到左的,人们就是从右到左来读的;现代汉语的顺序是从左到右的,人们就是从左到右来读的。大端:高位字节存在低地址,低位字节存在高地址。小端:高位字节存在高地址,低位字节存在低地址。人们规定网络字节序都是大端的,主机字节序可以是小端也可以是大端。在网络中跑的都是大端的字节序,在接收端根据本机的情况决定是否转换。下面的程序可以用来测试大小端程序:/* 字节序:字节在内存中的存储顺序原创 2021-03-13 11:40:03 · 254 阅读 · 0 评论 -
生产者消费者改进模型之二(使用信号量+互斥量实现)
使用信号量来实现资源的计数,使得生产者和消费者之间的活动能够有序进行。详见代码注释code:/* #include <semaphore.h> 信号的类型 sem_t int sem_init(sem_t *sem, int pshared, unsigned int value); -初始化信号量 - 参数: -sem :就是信号量原创 2021-03-11 15:53:00 · 679 阅读 · 0 评论 -
生产者消费者模型改进一(互斥量+条件量)
生产者只要有数据,每生产一个数据,就用pthread_cond_signal通知消费者;消费者,有数据的时候就消费,要是没有数据的时候就pthread_cond_wait等待生产者生产出资源;PS:pthread_cond_wait,当这个函数调用阻塞的时候,但是会先对互斥锁进行解锁;当不阻塞的时候,会重新加锁(保证数据的安全问题)。详见注释。code:/* 条件变量的类型 #include <pthread.h> 条件变量的类型 pthread_con原创 2021-03-11 15:50:01 · 210 阅读 · 0 评论 -
生产者和消费者模型(简单版本)
综述:在整个模型中,有三个比较关键的对象:生产者、消费者、和容器。其中生产者被用来生产资源,可以是单线程也可以是多线程;消费者被用来消耗资源也可以是单线程或者多线程;无论是生产还是消费都把容器当做一个介质(中间的交换者的角色)。下面的代码中用多线程进行生产和消费,容器使用链表,链表的操作是头插和头删。详见代码注释code:/*生产者消费者模型(粗略版本)*/#include <stdio.h>#include <pthread.h>#include <stdli原创 2021-03-11 15:41:00 · 162 阅读 · 0 评论 -
Linux之读写锁case
详见代码注释:/*读写锁案例 : 8个线程操作同一个全局变量三个线程不定时写这个全局变量,5个线程不定时地读这个全局变量*/#include <stdio.h>#include <pthread.h>#include <unistd.h>//创建一个共享数据int num = 1;//创建一个互斥量pthread_mutex_t mutex;//创建一个读写锁pthread_rwlock_t rwlock;void* writeNum(原创 2021-02-10 13:33:50 · 134 阅读 · 0 评论 -
Linux编程之管道
匿名管道:/* #include <unistd.h> int pipe(int pipefd[2]); 参数:int pipefd[2],传出参数 pipefd[0] 读端 pipefd[1] 写端 返回值: 成功返回0, 失败返回-1 注意匿名管道只能用于具有亲缘关系之间的通信(父子进程,兄弟进程) 管道默认原创 2021-01-07 13:16:13 · 131 阅读 · 0 评论 -
Linux进程回收之wait函数和waitpid函数
wait函数的demo#include <sys/types.h>#include <sys/wait.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>int main(){ pid_t pid; for(int i = 0; i<5;++i){ pid = fork(); if(pid == 0){原创 2021-01-07 11:42:20 · 109 阅读 · 0 评论 -
Linux之孤儿进程和僵尸进程
孤儿进程:#include <sys/types.h>#include <unistd.h>#include <stdio.h>//孤儿进程int main(){ pid_t pid = fork(); //判断是父进程还是子进程 if(pid > 0){ //返回的是创建的子进程的进程号 // printf("pid : %d\n",pid); printf(" i am pare原创 2021-01-06 18:02:21 · 145 阅读 · 0 评论 -
Linux之exec函数
/* #include <unistd.h> int execl(const char *path, const char *arg, ...); -参数: path : 建议写绝对路径,这样在不同的目录下都能执行 a.out /home/gabe/a.out arg : 是可执行文件所需要的参数列表 第一个参数一般没有作用,为了方便,写的是执行程序的名称原创 2020-12-30 21:06:30 · 200 阅读 · 0 评论 -
两个线程从将一个变量从1增加到100
#include <stdio.h>#include <unistd.h>#include <pthread.h>#define MAX_COUNT 100static int count = 1;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t is_odd = PTHREAD_COND_INITIALIZER;pthread_cond_t is_even = PTHREAD原创 2020-12-27 15:25:42 · 425 阅读 · 0 评论 -
Linux系统编程之fcntl函数
demo:#include <unistd.h>#include <fcntl.h>#include <stdio.h>/*1.可以复制文件描述符,复制的是第一个参数fd,得到一个新的文件描述符2.可以获取指定的文件描述符的状态(open函数里面flag函数)3.设置文件描述符的一个状态flag,必选项:O_RDONLY, O_WRONLY, O_RDWR 可选项:O_APPEND表示追加数据,先获取到原创 2020-12-25 16:17:20 · 127 阅读 · 0 评论 -
dup和dup2函数
#include<unistd.h>#include<stdio.h>#include<fcntl.h>#include<sys/types.h>#include<sys/stat.h>#include<string.h>int main(){ int fd = open("a.txt", O_CREAT | O_RDWR, 0664); int fd1 = dup(fd);//复制文件描述符,fd1也指原创 2020-12-22 19:15:59 · 330 阅读 · 0 评论 -
linux目录遍历函数
#include <sys/types.h>#include <dirent.h>#include <stdio.h>#include <stdlib.h>#include <string.h>int getFileNum(const char* path);int main(int argc, char* argv[]){ if(argc < 2){ printf("%s path\n", argv[0]原创 2020-12-22 17:50:29 · 189 阅读 · 0 评论 -
linux目录操作函数
mkdir函数#include <stdio.h>#include <sys/stat.h>#include <sys/types.h>int main(){ int ret = mkdir("aaa",0777);//最终的权限mode & (~umask) //目录必须要有可执行权限才能进入 if(ret == -1){ perror("mkdir"); return -1; }原创 2020-12-22 15:55:56 · 93 阅读 · 0 评论 -
linux文件属性操作函数
access函数demo:#include <stdio.h>#include <unistd.h>int main(){ int ret = access("a.txt", F_OK); if(ret == -1){ perror("access"); } else { printf("文件存在!!\n"); } return 0;}chmod函数demo:#include原创 2020-12-22 14:53:04 · 151 阅读 · 1 评论 -
linux拷贝一个文件的实现
#include <unistd.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main(){ // 打开eng.txt文件 int srcfd = open("english.txt", O_RDONLY); if (srcfd == -1) { perror("原创 2020-12-22 12:33:17 · 169 阅读 · 0 评论 -
linux ls -l 命令的模拟实现
//模拟实现 ls -l 指令//-rw-rw-r-- 1 gabe gabe 23 12月 21 20:42 a.txt#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <pwd.h>#include <grp.h>//#include <sys/types.h>#include原创 2020-12-22 12:31:40 · 281 阅读 · 0 评论 -
Linux动态库的制作和使用
Linux动态库的制作首先生成与位置无关的目标文件:gcc -c -fpic add.c div.c mult.c sub.c然后制作动态链接库:gcc -shared *.o -o libcalc.soLinux动态库的使用gcc main.c -o main -I ./include/ -l calc -L ./lib/这里需要注意,-l后面跟的是动态库的名字Linux动态库加载失败解决办法配置环境变量直接配置:export LD_LIBRARY_PATH=$LD_LIB原创 2020-12-15 22:07:36 · 242 阅读 · 1 评论 -
Linux静态库的制作和使用
Linux静态库的制作静态库在程序链接阶段被复制到程序中。库的好处代码保密;方便部署和分发。使用ar命令进行归档。ar rcs libcalc.a add.o div.o mult.o sub.o其中ar是归档命令,libcalc.a是静态库文件的名称,calc是静态库的名称。后面的*.o文件是制作静态库文件的物料。r:将文件插入备存文件中c:建立备存文件s:索引Linux静态库的使用使用静态库的命令。gcc main.c -o app -I ./include/ -l calc -原创 2020-12-15 19:53:30 · 166 阅读 · 0 评论 -
miniftp项目总结(八)
最大连接数的限制在session结构体重增加一个num_clients成员,在主线程序中,每当来一个客户端就使num_clients++。子进程在开启会话前要进行最大连接数限制的检查,只有小于最大连接数的限制才开启会话。那么子进程退出的时候如何对num_clients进行维护呢?void check_limits(session_t *sess){ if(sess->num_clie...原创 2020-04-19 08:44:19 · 339 阅读 · 0 评论 -
IO复用专题
I/O复用的场景I/O复用使得程序能监听多个文件描述符,这对提高程序性能很重要。I/O复用的应用场景如下:客户端程序要同时处理多个socket,例如:非阻塞connect技术客户端要同时处理用户输入和网络连接,例如:聊天室程序TCP服务器要同时监听socket和连接socket,这是其应用最多的场景服务器要同时处理TCP和UDP请求,例如:回射服务器服务器要同时监听多个端口,或者处理多种服务,例如:xinetd服务器PS:I/O复用虽然能同时监听多个文件描述符,但它本身是阻塞的。当有多个原创 2020-05-31 14:21:34 · 147 阅读 · 0 评论 -
你需要的Linux命令这里都有
zip优点:跨平台缺点:支持的压缩率不是很高压缩命令:zip -r archive_name.zip directory_to_compress解压缩:unzip archive_name.ziptarlinux下一个常用的压缩命令。它的好处就是它只消耗非常少的CPU以及时间去打包文件,他仅仅只是一个打包工具,并不负责压缩。打包tar -cvf archive_name.tar directory_to_compress解包tar -xvf archive_name.tar.gz上面这个解原创 2020-05-26 15:23:19 · 160 阅读 · 0 评论 -
miniftp项目总结(七)
空闲断开当客户端够多的时候,服务器的压力很大。客户端连接进行一些短时的操作,操作完成之后,空闲时间达到一定的程度,就会断开。如何实现这个功能???控制连接的空闲断开通过安装一个闹铃信号来实现。控制连接是否断开还得考虑此时是否有数据连接建立(即正在实现上传、下载、显示列表的功能)查看信号命令:kill -l数据连接的空闲断开上传、下载、显示列表的时候,数据连接必须保存。数据连接...原创 2020-04-17 21:47:49 · 171 阅读 · 0 评论 -
miniftp项目总结(六)
限速首先定义两个获取系统当前时间的函数:static struct timeval s_curr_time;long get_time_sec(void){ if (gettimeofday(&s_curr_time, NULL) < 0) { ERR_EXIT("gettimeofday"); } return s_curr_time.tv_sec;}...原创 2020-04-17 19:03:22 · 187 阅读 · 0 评论 -
miniftp项目总结(五)
其他杂项命令的实现cwd命令:static void do_cwd(session_t *sess){ if (chdir(sess->arg) < 0) { ftp_reply(sess, FTP_NOPERM, "Failed to change directory."); return; } ftp_reply(sess, FTP_CWDOK, "Dir...原创 2020-04-16 16:19:35 · 413 阅读 · 0 评论 -
miniftp项目总结(四)
被动模式的列表显示查看linux中进程的命令ps -ef | grep miniftpd结束进程killall miniftpdstatic void do_port(session_t *sess){ unsigned char v[6] = {0}; sscanf(sess->arg, "%d, %d, %d, %d, %d, %d,", &v[0], &am...原创 2020-04-15 17:26:13 · 217 阅读 · 0 评论 -
miniftp项目总结(三)
数据连接主动模式主动模式下连接的示意图:客户端将自己的ip和port发送给服务器,等待服务器的主动连接。主动模式下,解析客户端发来的ip和port示意图:被动模式被动模式的情况下,客户端来连接服务器,服务器需要获取自己的ip和port,并发送给客户端。...原创 2020-04-13 12:46:58 · 202 阅读 · 0 评论 -
miniftpd项目总结(二)
增加ftpcodes.h文件命令映射鉴权登录其他杂项命令的实现1增加ftp中一些规定的回复命令的宏定义2 映射机制,其实就是一个表(结构体数组),表中的元素是结构体(字符串+函数指针实现),函数指针的结构都是一样的:返回值为void,参数为session,这样才能够统一处理。解析完命令之后,遍历表执行相应的操作。要处理的问题;有的命令没有,有的命令有却没有实现,有的命令有并且也实现了...原创 2020-04-13 12:08:03 · 246 阅读 · 2 评论 -
miniftpd项目总结(一)
1.开发环境的搭建2. miniftpd的需求分析3. miniftpd的框架搭建1 在自己的Linux下,安装vsftpd(现成的服务器)。windows下安装客户端leapftp(测试)来编写我们自己的客户端。2 需求:共享文件,上传,下载,最大连接数的限制等等。有两种模式:主动模式和被动模式。服务器以...原创 2020-04-13 09:54:10 · 248 阅读 · 1 评论 -
进程通信之包裹函数
#include<iostream>using namespace stdFILE * Fopen(const char *path,const char *mode){ FILE *fp = fopen(path, mode); if(NULL == fp) { perror("fopen."); exit(1); ...原创 2019-03-17 09:19:06 · 172 阅读 · 0 评论 -
Linux进程通信之semaphore(信号量)
首先,写一个通用的头文件myutili.h:#ifndef _MYUTILI_H#define _MYUTILI_H#include<stdio.h>#include<unistd.h>#include<string.h>#include<stdlib.h>#include<sys/ipc.h>#include<...原创 2019-03-18 17:00:46 · 334 阅读 · 0 评论 -
Linux进程通信之FIFO(有名管道)
首先编写utili.h#ifndef _UTILI_H#define _UTILI_H#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#define BUFFER_MAX_SIZE 256...原创 2019-03-18 20:56:57 · 180 阅读 · 0 评论 -
Linux进程通信之shared memory(共享内存)
先写一个ser_shm.c:#include"myutili.h"int main(){ int shm_key = Ftok("myshm",0xff); int shm_id = shmget(shm_key, 1024*1024, IPC_CREAT|IPC_EXCL|0755); if(shm_id == -1) { perror...原创 2019-03-20 11:06:59 · 526 阅读 · 0 评论 -
Linux网络编程之UDP协议(一版)
最近正在学习网络编程,用UDP来实现服务器端和客户端的收发的简单通信。由于是第一版,所以写的比较粗糙,很多地方都有要改进的地方。例如:包裹函数,把客户端和服务器端共同都包括的头文件,宏都写在一个公共头文件里等等。以后有时间会继续改进。首先编写服务器端的程序ser_udp.c#include<stdio.h>#include<unistd.h>#include&...原创 2019-03-31 19:08:29 · 375 阅读 · 0 评论