4 linux c开发
文章平均质量分 60
/home/liupc
这个作者很懒,什么都没留下…
展开
-
Linux c学习目录
linux学习记录 自己写过的代码 linux开发环境配置 gcc编译器、静态库动态库 调试开关 Mac下gcc编写动态库、静态库 gcc优化选项 ...原创 2021-09-23 10:29:35 · 110 阅读 · 0 评论 -
项目:FTP服务器
ftp服务器:问题1:能不能上传目录。不能。问题2:每次只能有一个客户端连接。需要的数据结构:一个共同的路径信息。保存现在用户所在的当前路径。pthread_cond_t cond num个pthread_mutex_t mutex num个父线程流程:0.传入参数args.conf 拿到IP,端口,需要建立的线程数,最大的请求数1.创建目录ftpserver,可供遍历,上传下载使用。2.socket();3.bind();4.listen() 监.原创 2021-09-23 13:52:06 · 363 阅读 · 0 评论 -
linux中read,write与recv,send的区别
linux中read,write和recv,send的区别:1、recv和send函数提供了和read和write差不多的功能。但是他们提供了第四个参数来控制读写操作.int recv(int sockfd,void *buf,int len,int flags)int send(int sockfd,void *buf,int len,int flags) 前面的三个参数和read,write相同,第四个参数能够是0或是以下的组合:______________...原创 2021-09-23 13:50:05 · 1217 阅读 · 0 评论 -
文件映射MMAP
文件内存映射:速度比较快。MMAP 工作当中使用相当频繁。将一个文件映射到内存。页:物理内存。磁盘驱动器:直接把磁盘上一块。了解MMAP是学习大数据的第一步参数:start :填NULL。由系统决定映射区的起始地址。嵌入式编程的时候才自己写,系统帮你选就写NULL。size_t length:文件大小。用stat或fstat既要读又要写:PROT_READ|PROT_WRITEPROT_EXEC:硬编码,工作中不会用到。flags:填MAP_SHARE..原创 2021-09-23 13:46:57 · 413 阅读 · 0 评论 -
单工、半双工、双工
通信模式:单工、半双工、全双工单工数据传输只支持数据在一个方向上传输;半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 网卡的全双工(Full Duplex)是指网卡在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的网卡一般都.原创 2021-09-23 13:45:21 · 271 阅读 · 0 评论 -
time函数
time_t time1 = time(NULL) :返回1970.1.1举例现在的秒数.。time_t类型,就是一个长整形。printf("%ld",time(NULL)); //输出:1463325133。这个时间是距离1970年1月1日的秒数。使用函数char *ctime(const time_t * timep);函数把time_t类型的时间转换成字符串时间(人类可以识别的时间。)char t[128];strcpy(t,ctime(&time1)); ...原创 2021-09-23 13:44:20 · 241 阅读 · 0 评论 -
通过函数实现ll命令
ll命令显示如下:[liupc@ubuntu ~/Projects]$>lltotal 40drwxrwxr-x 5 liupc liupc 4096 May 15 06:23 ./drwxr-xr-x 15 liupc liupc 4096 May 15 05:22 ../drwxrwxr-x 2 liupc liupc 4096 May 12 11:07 0513/-rw-rw-r-- 2 liupc liupc 718 May 15 05:22 111drwx...原创 2021-09-23 13:42:52 · 348 阅读 · 0 评论 -
state获取文件状态
#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int stat(const char *pathname, struct stat *buf); //获取文件状态结构体stat的定义为: struct stat { dev_t st_dev; //如果是设备,返回设备表述符,否...原创 2021-09-23 12:36:56 · 343 阅读 · 0 评论 -
lseek、ftruncate、dup
改变文件大小: ftruncate文件偏移: lseek文件描述符的复制:dup、dup2lseek:偏移lseek 的返回值:当前光标的位置。lseek结合了两个功能。正常返回正值。-1失败。SEEK_SETSEEK_CURSEEK_END例子1:#include "func.h"int main(int argc,char* argv[]){ if(argc!=2){ wri...原创 2021-09-23 12:34:54 · 240 阅读 · 0 评论 -
基于文件描述符的文件操作
文件打开、关闭:open、close文件读、写: read、write改变文件大小: ftruncate文件定位: lseek获取文件信息: stat、fstat文件描述符的复制:dup、dup2文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。当进程打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。标准输入文件描述符 ...原创 2021-09-23 12:32:18 · 256 阅读 · 0 评论 -
深度优先遍历目录
磁盘文件系统类型:ext2 ext3 ext4 深度优先遍历目录#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <dirent.h>#include <strings.h>void printdir(char* pathname,int width){ DIR* dir=opendir(pathname);...原创 2021-09-23 12:29:14 · 688 阅读 · 0 评论 -
Linux目录操作
linux的目录操作:改变目录、文件权限:chmod获取、改变当前目录:getcwd 、chdir创建、删除目录:mkdir、rmdir获取目录信息:opendir、readdir、rewinddir、seekdir、telldir、closedir删除文件: unlink、unlinkatint chmod() //改变目录或文件的访问权限。相当于chmod。可以通过:man 2 chmod 查看。例子:#include<sys/stat.h&...原创 2021-09-23 11:34:52 · 203 阅读 · 0 评论 -
基于文件指针的文件操作
文件的打开、关闭:fopen 、fclosebzero()fopen() 在vs下有以下模式:r ( rb) :打开一个文件,读取a ( ab) :打开一个文件,从尾部写入。只能写,不能读。w (wb) :创建一个文件,写入(如果文件存在,就会覆盖)r+ ( rb+) :打开一个文件,可读可写。光标在开头。再写会覆盖后面的内容。a+ ( ab+) :打开一个文件,可读可写。光标在开头。(自己试一下!!!)w+ (wb+) :创建一个文件,可读可写。...原创 2021-09-23 11:32:50 · 170 阅读 · 0 评论 -
gcc优化选项
gcc优化选项:例:gcc –o hello –Wall–O2hello.c gcc对代码进行优化通过选项“-On”来控制优化级别(n是整数)。不同的优化级别对应不同的优化处理工作。优化选项“-O1”:主要进行线程跳转和延迟退栈两种优化。优化选项“-O2”:除了完成所有“-O1”级别的优化之外,还要进行一些额外的调整工作,如处理其指令调度等。优化选项“-O3”:略。优缺点:虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。...原创 2021-09-23 11:24:18 · 556 阅读 · 0 评论 -
Mac下如何用gcc编写动态库
Mac下如何用gcc编写动态库:步骤一:vim multi.cint add(int a,int b){ return a*b;}步骤二:gcc -fPIC -Wall -c add.c //-o add.o 可以省略。因为-c 默认生成同名的.o文件。步骤三:gcc add.o-dynamiclib-olibmulti.dylib //这时就生成了动态库。跟linux 的区别:1.是dynamiclib。2.名字是:li...原创 2021-09-23 11:21:27 · 595 阅读 · 0 评论 -
调 试 开 关
调试开关:当出现问题时,程序员定位的时候,会打开调试开关进行查看。而平时的时候,不让用户看到。既可以使交付的二进制代码,有能不让用户看到多余的乱七八糟的输出。例1:实验一:步骤1:vim test.c#include<stdio.h>void main(){ #ifdef DEBUG printf("Debug is open\n"); #else printf("Debug is not open"); #endif}原创 2021-09-23 11:16:09 · 259 阅读 · 0 评论 -
linux开发环境配置
linux开发环境配置步骤:步骤1:安装虚拟机,然后ping外面,看看能不能通。步骤2:putty: windows下的putty连接linux,用的协议是ssh 如何查看是否有:ssh pe-elf|grep ssh 看一下有没有这个服务。步骤3:给root配置密码: ubanto默认是没有root密码的。如何配置: 1.sudo passwd 2.输入自己用户的密码。...原创 2021-09-23 11:11:23 · 510 阅读 · 0 评论 -
自己写过的代码记录
gcc与动态库:1、编写一个c程序,依次进行预编译,编译,汇编,链接,得到.i文件,.s文件,.o文件,和可执行文件2、编写一个做两个数乘法功能的函数multi,返回值为输入的两个数的乘积,然后将其编译为动态库,静态库,并使用静态库和动态库,编写main.c,调用函数multi,得到可执行的二进制。gdb、makefile、目录操作:3、编写一个程序,通过gdb调试,使用到gdb的b,n,s,info,bt,p等命令,该题目通过截图提交4、编写一个程序,执行会产生段错误,然后产生c..原创 2021-09-23 11:07:46 · 331 阅读 · 2 评论 -
linux学习记录
一、学习计划Linux开发模块 (共4周)第1周命令,编辑器 VIM,gcc g++编译器,gdb调试,Makefile 编译工具,文件操作。(shell不讲)第2周进程 Process 多进程Linux调度进程间通信 IPC(管道 共享内存 信号量) 信号第3周线程 多线程 mutex cond条件变量 互斥和同步网络编程 socket 套接字 TCP UDP通信 epoll多路复用 并发处理第4周进程池与线程池 文件传输的阶段小项目开发二、学习记...原创 2021-09-23 11:03:10 · 123 阅读 · 0 评论 -
线程池
一、线程池:因为父线程和子线程公用文件描述符,所以线程池并不像进程池一样,需要socketpair、sendmsg、recvmsg来传递描述符。当有连接请求时,父进程产生一个new_fd,放到一个队列中。而子线程从队列中往外取new_fd,进行处理。需要的数据结构:一个共同的路径信息。保存现在用户所在的当前路径。父线程流程:1.socket();2.bind();3.listen() 监听客户端的...原创 2018-05-31 15:25:46 · 224 阅读 · 0 评论 -
gdb调试
gdb调试命令:gcc test.c -g -o test //如果想用gdb调试,编译的时候必须加-g参数。-g -o test 一定要连在一起,且-g 在-o test之前。gdb ./test 或 gdb test //开始调试程序,进去之后程序并没有开始执行。q //退出l //...原创 2018-05-29 20:21:08 · 190 阅读 · 0 评论 -
Makefile编写
make 工程管理器只要将上课讲的这些掌握即可。会写最简单的情况和最终版的情况。每个公司都有自己的编译框架。编译框架中连makefile都是自动产生的。所以一是不一定写;二是不一定让你写,有的会有专门的人写;三是看得懂,能改就行。make是增量编译。只把修改过的.c编译成.o,然后把所有的.o进行链接。如果没有修改,就不编。Makefile1(最简单的情况) main:main.o func.o ...原创 2018-05-29 20:22:01 · 232 阅读 · 0 评论 -
管道文件、select
一、管道:mkfifo 1.pipe //创建管道文件。通过ll可以看到管道文件的文件类型是"p".ll还可以看到管道文件的文件大小为0.因为管道文件不是用 来存储数据的。管道的特点:1.管道式半双工的,一端读,另一端只能写。2.双方使用同一个管道(即一方读,另一方写),一方打开管道之后,需要等待另一方打开,才能继续执行。3....原创 2018-05-29 20:23:23 · 2235 阅读 · 0 评论 -
Linux多进程
获取进程pid、ppid : getpid() getppid()进程的真实用户id和真实组id : getuid() 、getgid()进程的有效用户id和有效组id : geteuid()、getegid()程序和进程的区别:程序:是代码,是静态的。进程:程序的一次执行过程,是linux基本调度单位。进程通过进程控制块(PCB)来描述。进程调度: 内核的调度器负责在所有的进程间分配...原创 2018-05-29 20:24:29 · 838 阅读 · 0 评论 -
进程的创建、回收和终止
一、进程的创建: //内核里面只有fork 和exec两种可以创建进程。其他方式都是使用的这两种方式,如system()封装了exec。system()fork()exec()popen()二、进程的回收:孤儿进程僵尸进程wait()三、进程的终止:main函数的自热返回;调用exit函数;调用_exit函数;调用abort函数;接收能导致进程终止的信号Ctrl +c SSIGINT ...原创 2018-05-29 20:25:15 · 2027 阅读 · 0 评论 -
守护进程
deamon 守护进程守护进程:在windows下叫服务。以d结尾:sshd,如:syslog ssh守护进程和终端没有关系。不依赖于窗口。getpgid(); //获取进程组idsetpgid(); //独立出来,成为一个组。成立一个新的进程组。getsid(); //获得会话组idsetsid(); //当一个进程独立出来,变成一个新的会话。例1:#include <st...原创 2018-05-29 20:25:55 · 293 阅读 · 0 评论 -
进程间通信:IPC-管道
进程间通信方式:IPC(管道、共享内存、信号量) 、信号。IPC: 管道:分为标准流管道、无名管道、有名管道。 共享内存:将两个进程的虚拟地址空间。映射到同一块物理内存。 信号量:信号:约定好了,什么信号干什么事。------------------------------------------------------------------------------------------...原创 2018-05-29 20:27:06 · 303 阅读 · 0 评论 -
进程间通信:IPC-共享内存
共享内存:操作系统接口标准:system V 标准、posix标准。System V共享内存机制: shmget shmat shmdt shmctl共享内存的原理 :同一块物理内存映射到了多个进程的虚拟地址空间。pathname->key->shmid->连接->使用->解除连接。系统中每一个文件都是唯一的,所以可以用路径来产生key。同一个路径产生同一个ke...原创 2018-05-29 20:27:58 · 718 阅读 · 0 评论 -
进程间通信:IPC-信号量
信号量:来源于美国铁路调度。原语:原子操作。操作是完整的。没有人打断。现在都是用system V 信号量。semaphore:信号量、信号灯微指令:指令集。手机是arm处理器。i++; //做加法的时候,需要保护信号量同共享内存一样,不会随着进程的结束而消失。key_t ftok(const char *pathname, int proj_id); //产生key。proj_id...原创 2018-05-29 20:28:54 · 252 阅读 · 0 评论 -
进程间通信:信号
一、信号产生、处理、分类二、signal信号处理机制三、sigaction 高级版的信号处理函数四、全程阻塞 sigprocmask 五、信号相关函数 1.kill函数 2.sleep函数 3.alarm函数 4.pause函数六、计时器信号就像古代战场上打仗,摇什么旗子摆什么阵。双方已经约定好。能不使用信号就不要使用信号,因为是异步。信号是硬件中断的软件模拟(软中断)。ki...原创 2018-05-31 15:19:29 · 772 阅读 · 0 评论 -
Linux多线程
线程的概念线程的创建:pthread_create线程的退出: pthread_exit线程的等待退出(回收):pthread_join线程取消:pthread_cancel线程终止清理函数:pthread_cleanup_push、pthread_cleanup_pop一、线程的概念 进程从创建到运行需要700ms。线程的创建速度是100us,快了近1000倍。进程是系统中程序执行和资源...原创 2018-05-31 15:20:21 · 257 阅读 · 0 评论 -
线程的同步、互斥
mutex锁的创建和销毁mutex锁的属性加锁、解锁、测试加锁线程的同步信号量是system V标准,线程库是prosix标准。每一个标准都觉得自己牛,就自己写一套。写进程用前面的信号量、写线程用锁。linux锁的类型:1.自旋锁:主要用在内核调度中。spinlock。自旋锁的效率更高。不睡觉,二是不停地看锁有没有打开。嵌入式开发采用。2.互斥锁(睡眠锁):信号量、mutex。存在睡觉和唤醒的消耗...原创 2018-05-31 15:21:14 · 190 阅读 · 0 评论 -
网络编程
asource insight.f7搜函数一、网络介绍 协议:规则tcp/ip模型4层: 应用层{http超文本传输协议 ftp文件传输协议 telnet远程登录ssh安全外壳协议stmp简单邮件发送 pop3收邮件} 传输层{tcp传输控制协议,udp用户数据包协议} 网络层{ip网际互联协议 icmp网络控制消息协议 igmp网络组管理协议} 网络接口层{arp地址转换协议,rarp反向...原创 2018-05-31 15:21:53 · 264 阅读 · 0 评论 -
epoll多路复用
epoll多路复用 select效率随着描述符的增多,时间增多,因为内部是for循环。而epoll时间是固定的,不随着描述符的增多而增长。在工作中不再使用select,而是用epoll.epoll共有三个函数: a int epoll_create(int size); //创建一个epoll句柄。现在epoll不限制数量,所以size现在失效了,写1就可以...原创 2018-05-31 15:24:23 · 264 阅读 · 0 评论 -
进程池
进程池和线程池并发的给多个客户端提供服务。一、内核控制信息的理解 进程池最难的地方:当客户端连接服务器时,服务器产生一个new_fd,主进程如何将new_fd发送给子进程。使用下列两种方法传递内核控制信息,是不可以的:1.通过fork一个子进程,父进程打开一个文件 fd,通过管道把fd给子进程。这种方法是错误的。文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每个进程所维护的...原创 2018-05-31 15:25:11 · 535 阅读 · 0 评论 -
gcc编译器、静态库与动态库
gcc:编译器 业界最流行的编译器就是gcc,然后是微软的masm.mac已经默认安装了gcc、g++的编译器。gdb:调试器。一、gcc编译器:c 程序:使用gcc或g++编译器编译。c程序后缀为:.cc++程序:使用g++编译器编译。c++程序后缀为:一个编译过程包括下面几个阶段: (1)预处理:预处理器将对源文件中的宏进行展开。 (2)编 译:gcc将c文件编译成 汇编文件。 (...原创 2018-05-29 20:18:13 · 413 阅读 · 0 评论