
linux学习基础
文章平均质量分 70
入门级
白糖熊
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
打开ubantu报错(invalid environment block. Press any key to continue)
注:这时我才恍然大悟,因为我每次关机都没有先关掉ubantu而直接关闭的电脑(当时我想直接关机所有程序都会自动关的,无所谓嘛)出错原因:sd卡损坏,磁盘检测不能通过,可能因为系统突然断电或其它未正常关闭系统导致。注:如果还不行,可以试试这个命令:fsck -y /dev/sda1 后重启。今天向往常一样打开ubantu ,却无法正常打开,如下图。折腾了许久问题也没有得到解决,后来在某篇博客中找到了答案。意思是无效的环境模块,随意按键继续,按任意键后如下图。注:这里的sda1中的1改为你坏掉的盘。原创 2023-03-26 13:21:18 · 2387 阅读 · 1 评论 -
阻塞I/O,非阻塞I/O 同步I/O和异步I/O的区别
是调用read后,如果没有数据就立刻返回,通过不断轮询的方式去调用read,直到数据被拷贝到用用户态的应用程序缓冲区。应用程序发起一个I/O操作后,调用者不能立刻等到结果,而是在内核完成I/O操作后,通过信号或回调来通知调用者,异步I/O是内核数据准备好和数据从内核拷贝到用户态两个过程都不需要等待。无论是read是阻塞I/O,还是非阻塞I/O都是同步调用,因为在read。:当用户调用read函数后,用户线程被阻塞,等内核数据准备好并且数据从内核缓存区拷贝到用户缓存区后,read才返回。原创 2022-12-09 22:02:48 · 75 阅读 · 0 评论 -
【文件传输】实现下载
lseek:获取文案描述符的偏移量(文件大小)服务器 thread.c。原创 2022-11-15 21:40:59 · 334 阅读 · 0 评论 -
【文件传输】查找等相关命令
1.查看:通过客户端查看服务器端都有哪些文件?(删除,重命名)2.下载 :(显示下载百分比)断点续传3.上传客户端发送命令信号,服务器进行执行,并回复客户端。将命令的名字作为协议。原创 2022-11-14 16:53:19 · 361 阅读 · 0 评论 -
【reactor模式】【proactor模式】
4.应该用程序预先定义好的信号处理函数选择一个工作线程处理客户请求,工作线程处理完客户请求之后,调用aio_write函数向内核注册socket写完成事件,并告诉内核缓冲区的位置,以及写操作完成时如何通知应用程序。主线程执行读写操作,读写操作完成后,主线程向工作线程通知“完成事件”,也就是说,工作线程直接获取了读写的结果,只对读写结果进行逻辑处理。1,主线程调用aio_read函数向内核中注册socket上的读完成事件,并告诉内核缓冲区的位置,以及读操作完成时如何通知应用程序。5.主线程继续处理其他逻辑。原创 2022-10-16 18:40:48 · 423 阅读 · 0 评论 -
【libevent】reactor模式--模拟服务器客户端
调用时由 event_base 负责传入,按顺序,实际上就是 event_set 时的 fd, event 和 arg;I/O框架库:封装select,poll,epoll,提供了一个更加便捷的接口。:这是一个函数指针,当 fd 上的事件 event 发生时,调用该函数执行处理,它有三个参数,:该 event 绑定的“句柄”,对于信号事件,它就是关注的信号;创建具体事件处理器(利用回调函数)在循环事件中执行。:在该 fd 上关注的事件类型,它可以是。ctrl + \ 结束程序。,可以一直处理定时事件。原创 2022-10-15 21:35:30 · 496 阅读 · 0 评论 -
【libevent安装】
如果安装不成功,是因为本地依赖的库版本openssl不匹配,需要重新安装。libevent :对I/O函数进行封装。原创 2022-10-14 15:10:19 · 357 阅读 · 0 评论 -
【I/O复用】epoll (LT和ET模式)
如:客户端向服务器端发送10数据,用recv从接收缓冲区每次只读取一个数据,就算此时客户端继续发送数据,IO函数也会提醒服务器,接收缓冲区中有数据,recv也会一个一个将所有接收缓冲区上的的数据收完。:如果客户端向服务器发送10个数据,recv没读取或者没读完接收缓冲区中的数据,I/O函数不会提醒,缓冲区中还又就续航事件,只有客户端又发来一条数据,recv才会再去读一次数据,不管读没读完,I/O函数都不会提醒。1. 获取就绪的文件描述符的个数,并将其存到evs数组中。即便描述符关闭,不可以向对方数据。原创 2022-10-14 13:54:51 · 463 阅读 · 0 评论 -
【I/O复用】epoll (仅存在于linux系统)
举个例子:如果老师要知道一个班中,有多少人写完作业,就需要将所有人的作业挨个都检查一遍。epoll采用的方式:就是只需要老师让写完作业的人,把作业交上去,就知道有多少人写了作业。(所以当事件特别多的时候,epoll的优势就很明显)指向的数组中,该数组仅用于输出就绪事件,而select和poll中的数组既可以传入用户注册的事件,还用于输出内核检测到的就绪事件。该函数成功返回的是就绪文件描述符的个数,失败返回-1,并设置为errno。select 和 poll采用的是一种轮询的方式,(在一段超时时间内等待。原创 2022-10-12 14:51:34 · 798 阅读 · 0 评论 -
【git工具基础应用】
git:(分布式)各个代码的历史版本会在每个人的计算机上存一份。因此即使服务器 出现故障,只要把一个人的库推上去,数据就可以恢复。因此即便不在局域网内,也可以提交代码,因为提交完成,在本地也会存一份。删除一个文件, 此时提交到暂存区,需要commit后才在版本库中删除.使用 git commit -m “版本描述信息” 提交版本到仓库。11.git reset --hard 版本号跳转到指定版本。第一次代码提交Version之前,需要设置邮箱和姓名。:将.c/.cpp文件提交到暂存区中。原创 2022-10-12 10:00:07 · 435 阅读 · 0 评论 -
【守护进程】
如果想要终端关闭,但是会话不关闭,就需要创建一个新的会话,将原来会话中的进程挪出来,挪到新的会话中。只要进程组中有一个成员存在,那么该进程组就还存在,与组长进程是否存在无关。运行周期长,不需要和用户交互,即便我们关闭终端,该进程也会在后台运行。:整个会话运行的第一个进程称为会话首进程。如果是父进程不要让子进程变成僵死进程。(每个会话中有多个进程组,每个进程组中有多个进程):使用组长进程的PID号,来标识整个进程组。留下子进程 留下子进程的子进程。该进程会变为会话首进程以及组长进程。原创 2022-10-11 15:42:09 · 229 阅读 · 0 评论 -
【文件传输】正常连接
1.下载(可以打开)支持跨主机下载,客户端和服务器不在一个计算机上。创建一个用户,可以A,B用户来分别看到自己所属下得文件。模拟应用商店中安装包得下载(模拟百度网盘,个人云相册)多线程/IO复用/libevent完成多客户端得处理。ser.c (处理监听套接字,并创建,启用多线程)thread.c(利用线程支持多客户链接服务器)socket.c(从配置文件获取ip和端口,)makefile (对多个文件进行编译)my.conf(保存ip,端口等信息)3.查看,删除,重命名。...原创 2022-08-13 22:46:43 · 123 阅读 · 0 评论 -
【IO复用】poll
poll系统调用和select相似,也是指定时间内循环遍历一定数量的文件描述符,来测试是否有就绪者。socket内核接收缓冲区的内存有数据,就可以无阻塞读该socket,并且读操作返回字节数大于0;socket写操作关闭,对写操作关闭的socket执行写操作,会触发SIGPIPE信号。socket内核发送缓冲区有空间,则可以无阻塞写该socket。fds参数是一个pollfd结构类型的数组,(数组越大,容纳的事件更多)socket 关闭连接,则只需要读取关闭信息,即可返回0;(事件复杂度为1)(...原创 2022-08-09 16:43:47 · 174 阅读 · 0 评论 -
【网络编程】http
需要以管理员的权限才可以。原创 2022-08-09 16:42:48 · 97 阅读 · 0 评论 -
【mysql数据库】mysql数据库的使用/C语言访问mysql
mysql必知必会》 【查询】必须看!!!!!!!!!!!!!!port :3306命令:安装 :(红帽子 是mysqld)【管理员模式】:客户端-uroot:用户(mysql自己的数据库管理员)-p:密码;localhost :本主机登录:一个远程登录,一个:创建一个远程登陆的root用户:mysql>mysql>mysql>exit/quit。......原创 2022-08-08 16:10:24 · 692 阅读 · 0 评论 -
【IO复用】select(处理读/写/异常事件)
客户端和服务器:(如果一个客户端在给服务器发数据,那么就会在recv阻塞住,就多个客户端就不能并发运行,就需要使用多线程,来接收不同的c,但是多线程是有限的)一个select最多处理1024个描述符 只要使用的就置为1。IO复用可以使程序同时监听多个文件描述符。通过检测那个文件描述中有数据,就去接收。按位与,来判断是否有数据。...原创 2022-08-06 15:39:13 · 986 阅读 · 0 评论 -
【网络编程】UDP|TCP拥塞控制
UDP:(主要问TCP和UDP的区别)使用UDP还是TCP看数据可不可以丢。例如客户端–服务器UDP 可以直接 多个客户端给服务器发送数据,且服务器可以收到,因为不需要建立连接。并且,服务器关闭,不关闭客户端,再次打开服务器,客户端仍然可以将数据把给服务器。客户端发给服务器 的数据,如果服务器收不完,会直接丢掉。(每个数据包都会独立发送,)只要告诉目的端口,给谁都能发数据。(如果数据丢失,可靠性在应用层实现)ser.ccli.c《云服务器》使用滑动窗口:《计算机网络》5.7.1T原创 2022-08-04 10:17:16 · 1833 阅读 · 0 评论 -
【网络编程】 粘包问题/TCPdump(抓包)/滑动窗口(糊涂窗口)
因为糊涂窗口综合征的原因使大量小数据在网络上传输,而且由于TCP是一种可靠的传输协议,每个数据包都要用一个ACK来确认(没用使用延迟确认情况下如此),所以浪费一些时间,而且丢包和失序的可能性也增加了。服务器端就会关闭,重新打开服务器也是处于CLOSED状态,客户端没有收到任何关闭的信息,但是客户端以为已经完成三次握手,直到一发数据,发现数据发不了(序号值不匹配)。乱序重排(去重,序号相同的报文会丢弃)(报文发送的早,不一定先到达,因此会给每个报文都带有一个序号(随机产生),到达后,会重新排序)...原创 2022-08-01 18:26:33 · 912 阅读 · 0 评论 -
【网络编程】TCP服务的特点。多线程处理并发。(流式服务的特点)
比如你发快递,第一次给快递员,快递员拿走了,(已经在规定时间发货)(还没有发货,放在快递站仓库),你又要去再发一件,你的两件快递发出去的可能性就是,第一个已经发了,第二个后发和两个同时发出。UPD是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。打个比方比喻TCP,有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子、矿泉水瓶、锅碗瓢盆)接水。(视频,图片,大文件)......原创 2022-07-31 20:22:01 · 646 阅读 · 0 评论 -
【网络编程】三次握手/四次挥手
数据传输完毕后,就释放了连接,客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,不采用三次握手,只要服务端发出确认,就建立新的连接了,此时客户端忽略服务端发来的确认,也不发送数据,则服务端一致等待客户端发送数据,浪费资源。连接服务器指定的端口,建立TCP连接,同步双方的序列号和确认号,交换。...原创 2022-07-31 10:02:13 · 437 阅读 · 0 评论 -
【网络编程】TCP/IP (客户端--服务端)
通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。MAC(物理地址)48位实现数据包的选路和转发。IP地址有分IPV4(32位)和IPV6(128位)两种类别格式,(主机号和网络号构成)传输层为应用层提供过了一个进程间通讯的途径(TCP/UDP/SCTP)OSI七层协议,TCP/IP五层协议寄快递,ip/协议发送的数据大小有限制。面向连接的可靠的流式服务套接字通过套接字进行收发数据。(相当于手机)...原创 2022-07-30 19:21:52 · 3025 阅读 · 0 评论 -
【线程网络】了解线程属性(fork/interview question)
线程的实现从Linux的角度讲《linux内核设计与实现第三版》3.3。线程同步的方法对临界资源的访问,举个例子,红绿灯控制交通,、多线程的调试《高性能服务器编程》16.3.2gdb调试多线程。线程的并发运行50004999主线程运行的太快。线程安全用进程同步的方法解决并发,并行带来的问题。(遇到死锁,怎莫解决)?...原创 2022-07-29 10:16:13 · 154 阅读 · 0 评论 -
【线程安全】用户级,内核级,组合级线程|线程同步的处理(条件变量)|strtok_r(可冲入函数)
用户级线程,内核级线程,线程创建依靠操作系统,是否支持。组合级线程同时拥有用户级线程和内核级线程。内核级的线程数受凑cpu数目的影响,而用户是通过直接调用用户线程库中的线程,只是用一个cpu,当创建的线程数超过cpu的数目,可以使用用户创建更多的线程。进程对内核的所有访问,都需要接口linux其实本身并没有线程的概念,所谓线程就是可以共享某一资源(地址空间)的进程。...原创 2022-07-27 20:39:46 · 430 阅读 · 0 评论 -
【线程】 理解线程(并行)线程同步的处理(信号量,互斥锁,读写锁,条件变量)
例如单链表进行尾插,多个处理器中线程同时获得尾部指针,同时插入结点,就可能出现覆盖的情况。因此需要去控制多个处理器同时处理数据带来的问题。//传入信号量的地址\给信号量初始化的值。(不能用于初始值为0的情况,但是信号量可以)//信号量是否可以被多个线程共享(0)多条执行路径,会产生冲突。并行是一种特殊的并发。...原创 2022-07-25 17:00:56 · 246 阅读 · 0 评论 -
【线程】线程创建 | 理解线程并发 (1)
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);//thread: 接收创建的线程的 ID//attr: 指定线程的属性 (一般传空)//start_routine: 指定线程函数//arg: 给线程函数传递的参数//成功返回 0, 失败返回错误码```...原创 2022-07-24 15:58:59 · 347 阅读 · 0 评论 -
【进程间通信】消息队列
接收的消息,必须是发送消息中已经定义的消息类型,每次都会读取同意消息类型的所有消息。msqflg一般设置为0可以设置IPC_NOWAI。msqsz指定mtext中有效数据的长度。msgsnd()成功返回0,失败返回-1。longtype;读不到消息,也可以阻塞,自我控制。没有删除消息,也不影响。...原创 2022-07-24 09:34:42 · 246 阅读 · 0 评论 -
【进程间通信】信号量的使用/共享内存
帮助手册 man semget;(信号量)man semctl(封装)- 信号量是由内核控制的。不受A/B进程的控制`semget()` **创建/获取**一个已存在的信号量 //A 创建好信号量(需要初始化信号量`semget---semctl()`) ,B只需要加入(无需再初始化`semget()`获取信号量)`semop()` p,v 修改信号量`semctl()` 初始化,删除信号量 (初始值为1,表明资源空闲)sem_init()// semge原创 2022-07-23 16:12:00 · 514 阅读 · 0 评论 -
【进程间通信】:管道通信/有名/无名
因为标准输入输出已经被a.txt覆盖,因此就没有标准输出和标准输入了。pclose()只在popen启动的进程结束后返回。返回值是所关闭的文件流所在的进程的退出码。如果父进程提前获取了该进程的退出码,那么该进程极其资源被回收。popen()允许一个程序将另外一个程序做为新进程启动。也就是pclose必须在父进程获取该进程退出码之前执行。产生一个子进程,(因此父进程负责写,子进程负责读)也就是一个程序的输出命令作为了另一个程序的输入。打开管道文件,直接将管道的文件描述符返回。...原创 2022-07-22 11:23:28 · 313 阅读 · 0 评论 -
信号/修改信号的响应方式
信号:相当于系统发送给某个进程响应的是某个条件,而该进程执行相应的操作。(比如子进程结束,内核会发送一个信号给父进程,父进程去执行wait()获取子进程的退出码)Object_signal 属于目标进程(响应信号)mykill/3_mykill 属于发送进程(发送信号)代码演示:第一次调用,打印后,signal的SIG_DFL会覆盖fun_sig,因此第二次执行不再是自定义信号,而是默认信号//Object_signal 5 void fun_sig(int sig) 6 { .原创 2022-05-21 15:55:30 · 275 阅读 · 0 评论 -
printf/僵死进程/fork/3道经典面试题
缓冲区:刷新时间:1.缓冲区满了2.(没有满,但是强制刷新"\n")3.程序结束。printf():因为printf打印,是先将数据存储在缓冲区,待程序结束时,刷新缓冲区才能得到数据。在linux系统中,父进程的父进程是bash(命令解释器,每一个进程都是fork()出来的。逻辑地址和物理地址打印出来的的都是逻辑地址(&n)(地址的偏移量),逻辑地址相同,并不是物理地址相同。如下图所示:通过逻辑地址来得到对应的物理地址&n / 4k(8k) = 商(页面)(余.原创 2022-05-20 15:26:03 · 215 阅读 · 0 评论 -
简单了解扫描目录
什么是扫描目录:就是确定一个特定目录下存放的文件。使用shell很简单就是用一次表达式的通配符扩张。目前用一整套的标准库函数,让扫描目录变得非常简单。均声明在dirent.h的头文件中(使用一个叫做DIR的结构作为目录操作的基础。如下:opendir :打开一个目录,并建立目录流,成功,返回DIR结构的指针,该指针用于读取目录的数据项。 DIR *opendir(const char *name); 目录流使用一个底层文件描述符来访问目录本身,所以打开的文件过多,opendir会失败。cl原创 2022-05-19 14:08:59 · 573 阅读 · 0 评论 -
exec进程替换/malloc申请空间
进程替换使用 man exec 查看其不同的函数类型。主要有四种:execl()execlp()execv() execvp()(以上四种除了参数不一样,其他都一样,只是处理的场景不同)上面四个均为库函数,最终陷入内核调用的execve()并且由于替换的是当前的进程,因此不会返回值,因为当前进程是其父进程拷贝出来的,只是替换了它的实体部分(替换函数调用成功,该进程就变成了一个新的进程,会从头重新执行(其内部整个代码段都会被替换))示例:以ps替换当前程序为例char path 新替换程序.原创 2022-05-19 13:07:33 · 339 阅读 · 0 评论 -
文件操作/写实拷贝
传统fork() :一般将所有资源复制给新创建的进程,而如果新进程立即执行一个新的印象,所有的拷贝都会前功尽弃。写实拷贝:优点:提高了代码的复制效率子进程只复制了父进程的页表,因此父子进程共享同一个拷贝,只有在执行写操作的时候,才会复制资源。否则在以读方式不会复制资源。(是一种推免,甚至免除的拷贝)在fork()执行后,会立即调用exec()—因此无需复制,而fork()实际开销只有复制父进程的页表,以及子进程创建的唯一进程描述符。优化后: 一般情况,进程创建后会立即运行一个可执行文.原创 2022-05-18 18:09:42 · 598 阅读 · 0 评论