- 博客(65)
- 收藏
- 关注
原创 网络学习:基于多进程的并发服务器
今天在练习多进程的并发服务器是出现了一个accept函数bad file descriptor的错误信息。分析了一下代码,原来是忘记让子进程在循环外退出了,导致子进程直接执行了,close(listenfd)。所以返回了这个错误码。记录一下。
2017-11-18 15:57:31
558
原创 网络编程学习:io模型之io多路复用
多路复用的概念:简而言之,就是将准备要用的文件描述符添加到一张表里,然后让select等待表里的任一描述符准备就绪(就是可以执行了),然后执行那个已经准备就绪的文件描述符,然后把其他的没有准备好的文件描述符全都删除;援引知乎上的一个解释:“” 这些名词比较绕口,理解涵义就好。一个epoll场景:一个酒吧服务员(一个线程),前面趴了一群醉汉,突然一个吼一声“倒酒”(事件),你小跑过去给他倒一杯,然
2017-11-09 15:25:39
453
原创 vmware tools手动安装方法
第一步,将vmware安装目录下的linux.iso挂载到CD/DVD中;第二步,点击虚拟机右下角相应的CD/DVD(就是你挂载到哪个里面了,就选哪个,鼠标停在那可以看见挂载的内容),然后点击“连接”;第三步,将光盘里的VMwareTools文件拖拽到桌面,然后打开一个终端,cd Desktop;第四步,然后tar -xzvf VMwareTools-10.0.6-3595377.tar.gz,将
2017-11-06 13:22:13
3134
原创 进程学习:进程间通信(基础知识篇)
system v IPC 函数一览图key值 和 id值其他IPC的***get函数也是这样的原理;查看 IPC(消息队列、共享内存、信号灯) 命令行参数一、 ipcs 查看所有 IPC,如下图所示: 二、分别查看消息队列、共享内存、信号灯; 1. ipcs -q :查看消息队列; 2. ipcs -m :查看共享内存; 3. ipcs -s : 查看信号灯;三、删除消息队列、共享
2017-11-01 15:53:44
461
原创 进程学习:进程间通信(传统通信方式)1.无名管道
无名管道的特点:1.适用场景:只能用于具有亲缘关系的两个进程之间; 2.通信模式:半双工模式,具有固定的读端(0)和写端(1); 3.读写方式:用文件io,不支持lseek; 4.读阻塞:当管道中无数据时; 写阻塞:当管道中写满数据时; 5.管道大小:无名管道大小64k; 6.管道破裂:关闭读端,仍然想管道中写入数据时; 对管道进行写的进程会收到内核发
2017-10-23 22:25:01
371
原创 进程学习:进程间通信(system v IPC)3.信号灯
1.信号灯是有若干个信号量组成;2.semctl,可以控制整个信号灯,也可以对信号灯中的某一个信号量进行控制;GETVAL /SETVAL对信号量进行操作IPC_SET/IPC_SATA/IPC_RMID共享内存和信号灯是结合使用的;
2017-10-21 14:35:23
353
原创 进程学习:进程间通信(system v IPC)2.共享内存
1.共享内存与消息队列、管道的区别:消息队列、管道中的数据读取之后就没有了;共享内存中的数据无论读取多少次,都还会在里面;2.共享内存读取相对于消息队列与管道来说,效率最高,直接对指向共享内存的指针进行读写操作;
2017-10-21 13:41:44
341
原创 进程学习:进程间通信(system v IPC)1.消息队列
消息队列与管道的异同点:消息队列与管道的相同点:1.都是利用内核的1G空间来通信(如图);消息队列与管道的不同点:1.管道的数据读取是严格按照先进先出;2.消息队列的数据读取可以按照数据类型进行读取;ftok用于IPC通信(消息队列,共享内存,信号灯)ftok,确保两个进程打开的是同一个消息队列;ftok可以产生一个唯
2017-10-21 10:00:44
537
原创 进程学习:进程间通信(传统通信方式)3.信号
信号是一个异步通信(意思就是忽略程序执行的先后顺序),大白话就是你别管我,我在呢,你该干啥就干啥,等到信号来时,我会蹦出来处理信号的;常用到的信号函数: kill:向指定进程发送一个信号; raise:向当前进程发送一个信号; alarm:给当前进程设置一个定时器; pause:阻塞等待,直到当前进程收到一个信号为止; signal:捕获一个信号,并执行用户自定义的信号处理程序,或执行忽略
2017-10-21 09:58:17
370
原创 io学习:标准输入、标准输出、标准出错
标准io与文件io中的标准输入、标准输出、标准出错:标准io回显函数#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#define N 32int main(int argc, const char *argv[]){ int ret; char buf[N]; whi
2017-10-20 21:36:20
528
原创 io学习:2.细说缓存区
一、缓存区对比分析1.测试缓存区大小全缓存:4K,测试程序输出为4096,1K = 1024;#include <stdio.h>#include <stdlib.h>int main(int argc, const char *argv[]){ FILE *fp = NULL; if( (fp = fopen("test", "w")) == NULL) {
2017-10-18 22:44:00
447
原创 io学习:1.标准io与文件io
一、标准io与文件io的区别1.缓存区 (这是哪本书里写的来,忘记了。一定要找到!!!贴原图)标准io的缓存类型(APUE): 全缓存:在填满标准I/O缓冲区后才进行实际的I/O操作; 行缓存:当输入输出中遇到换行符时,标准I/O库执行I/O操作 无缓存:vi -t FILE 结果如下:typedef struct _IO_FILE FILE;Ctrl + ] 追索源码如下:struc
2017-10-17 22:29:30
510
原创 进程学习:进程退出_exit()和exit()
_exit 和 exit 最大的区别在于后者在结束进程时会刷新缓存区,前者则不会刷新缓存区;#include <stdio.h>#include <unistd.h>#include <sys/wait.h>#include <sys/types.h>int main(int argc, const char *argv[]){ pid_t pid; if( (pid = fo
2017-10-16 17:25:18
388
原创 进程学习:初见进程
进程 pid_t fork(void); 功能:创建一个新的进程 参数:无 返回值: 成功:如果是父进程返回子进程的pid号;如果是子进程返回0; 失败:返回-1特点一:调用一次,返回两次#include <stdio.h>#include <unistd.h>#include <stdlib.h>int main(int argc, const char *argv[]){
2017-10-16 16:14:32
296
原创 进程学习:4-僵尸进程
一、僵尸进程:当前进程运行结束,但其资源没有被回收;二、验证方法: 1.用fork函数创建两个进程,让子进程退出,父进程不调用wait/waitpid为子进程回收资源;(代码如下)#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(int argc, const char *argv[]){ pid_
2017-10-15 21:50:32
415
原创 arp地址解析协议
简述本博文内容大义来自《tcp/ip详解:卷一》、《计算机网络:自顶向下方法》、《计算机网络(谢希仁)》、《图解tcp/ip》的学习内容。计算机间进行通信必须要知道彼此的ip地址、mac地址,两者缺一不可 arp协议就是保障通信的计算机双方都知道彼此ip地址、mac地址的一种机制。arp缓存arp缓存是arp协议运行的基础 1.timer: 缓存中每个条目都有一个计时器,用于清除超时的条目(完
2017-10-11 09:49:57
2268
原创 冒泡排序
冒泡排序冒泡排序打印程序int display(int *arr){ int i; for(i = 0; i < N; i++) { printf("%d ", arr[i]); } putchar(10); return 0;}冒泡排序程序int main(int argc, const char *argv[]){
2017-10-09 14:42:08
1724
原创 线程间通信之信号量(多文件编程,全局变量的问题)
线程间通信是利用全局变量来进行通讯的。在多文件编程下,全局变量的引用声明该如何做呢? 下面写一个从标准输入读数据,并且在标准输出打印数据的小程序,来演示一下。-----thread.h---------------------------------------------#ifndef thread_h#define thread_h#include <stdio.h>#include <
2017-09-27 22:52:53
1114
原创 fputs标准库实现
int fputs(char *str, FILE *stream){ int c; while(c=*str++) putc(c, stream); return ferror(stream) ? EOF : 非零值}所以fputs不会将str里的‘\0’写入到stream中去。
2017-09-26 06:45:44
740
原创 vi -t tag的配置过程
步骤一:安装ctags sudo apt-get install ctags步骤二:切换到/usr/include目录下 cd /usr/include步骤三:生成tags文件 sudo ctags -R步骤四:配置环境变量 export PATH=”/usr/lib/lightdm/lightdm:/usr/include” export完成
2017-09-10 22:30:43
850
原创 unpv13e/lib/readn.c
#include "unp.h"/* Read "n" bytes from a descriptor: 从套接字描述符读取n个字节到定义好的缓冲区里去*/ssize_t readn(int fd, void *vptr, size_t n){ size_t nleft; //size_t 是无符号整形,相当于unsigned int; 要读取的字节数 ssize_t
2017-09-06 22:20:25
360
原创 unpv13e/sock/error.c
#include <errno.h> /* for definition of errno */#include <stdarg.h> /* ANSI C header file */#include "ourhdr.h"static void err_doit(int, const char *, va_list);char *pname = NU
2017-08-22 11:00:49
338
原创 unpv13e/lib/unp.h头文件
此代码为《Unix网络编程卷一:套接字联网API(第三版)》源代码 源代码下载地址:http://www.ituring.com.cn/book/164 /* include unph *//* Our own header. Tabs are set for 4 spaces, not 8 */#ifndef __unp_h#define __unp_h#include "
2017-08-17 22:49:46
1000
原创 编译系统四步骤——预处理、编译、汇编、链接
编译系统gcc编译器将C程序文件翻译成一个可执行目标文件分为四个阶段(预处理、编译、汇编、链接),执行这四个阶段的程序构成了编译系统。 C程序文件/hello.c#include <stdio.h>int main(int argc, const char *argv[]){ printf("hello world\n"); return 0;}一. 预处理:预处理器(cpp)根
2017-08-17 16:51:04
1029
原创 E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
解决: sudo rm /var/lib/dpkg/locksudo rm /var/lib/dpkg/locksudo dpkg –configure -a
2017-08-16 12:25:17
483
原创 卸载vim 安装vim
1:卸载vim:sudo apt-get remove vim-common 2:安装vim:sudo apt-get install vim
2017-08-14 14:41:02
9837
转载 安装vim时 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ubuntu 安装vim 及遇到的错误处理
vim
2017-06-09 17:37:58
2360
原创 数据库如何与软件连接
答案一: 软件可以通过好多种方式连接数据库,有微软提供的(ODBC)开放式数据库连接,和SUN提供的JDBC(java 数据库连接),也可以用数据库服务商提供的API来实现数据库访问。 数据库系统也有好多种,有IBM公司的DB2,有甲骨文公司提供的oracle系列,还有微软提供的SQL Server, 还有免费版的MySQL。 你看到的大多数小网站用的都是MySQL。 你可以学学这个数据库系
2017-06-07 12:17:42
8145
原创 wireshark使用及抓包分析(一)
作为一个跨行业的网络初学者,最近云里雾里的看了两遍《图解TCP/IP》,对网络知识有了些最基本的了解,先前在知乎里看到大神说学习网络得结合着抓包学习才有意思。所以自己一边百度着wireshark的使用,一边看着《图解TCP/IP》苦逼的一点点的让自己成长。百度”wireshark”并下载安装这个传说中的牛逼软件。 双击图上的本地连接
2017-04-14 11:06:21
672
转载 ubuntu 16.04 下安装搜狗输入法教程
本文转载自:http://blog.youkuaiyun.com/qq_21792169/article/details/53152700最近开始学习linux 在安装输入法中遇到的一些问题,最终成功安装,也得益于网络上的前辈写的文章,现在将全部安装步骤以及遇到的一些问题总结如下:基本上分三步走 1,添加fcitx的键盘输入法系统,因为sogou是基于fcitx的,而系统默认的是iBus; 2,安装sogo
2017-04-10 10:51:53
805
转载 vim的安装与配置
本文转载自http://blog.youkuaiyun.com/g_brightboy/article/details/14229139#comments;【vim的下载与安装】1. 在线安装直接shell中输入如下命令: [plain] view plain copy 在CODE上查看代码片派生到我的代码片sudo apt-get install vim (ubuntu) yum install vi
2017-04-02 12:08:27
836
原创 ubuntu 下安装 vim 编辑器的问题解决
问题描述: root@zhouls-virtual-machine:~# apt-get install vim Reading package lists… Done Building dependency tree Reading state information… Done Package vim is not available, but is referred to by an
2016-11-30 14:01:20
641
原创 网络编程学习: 1.文件服务器( server 端)
程序目的: 利用tcp通信协议实现客户端对服务器端文件目录的下载、文件的下载、文件的上传、退出等;#include <stdio.h>#include <stdlib.h>#include <string.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys
2016-11-27 22:43:45
535
转载 线程学习:1-理解PV操作和信号量
一、进程通常分为就绪、运行和阻塞三个工作状态。三种状态在某些条件下可以转换,三者之间的转换关系如下: 进程三个状态之间的转换就是靠PV操作来控制的。PV操作主要就是P操作、V操作和信号量。其中信号量起到了至关重要的作用。二、对于信号量,可以认为是一个仓库,有两个概念,容量和当前的货物个数。P操作从仓库拿货,如果仓库中没有货,线程一直等待,直到V操作,往仓库里添加了货物,为了避免P操作一直等待下去,
2016-11-16 12:47:24
623
转载 进程学习:5- 守护进程
4.2.4 Linux守护进程工作原理和方式在C/S模式下,服务器监听(Listen)在一个特定的端口上等待客户连接。连接成功后服务器和客户端通过端口进行数据通信。守护进程的工作就是打开一个端口,并且等待(Listen)进入连接。如果客户端产生一个连接请求,守护进程就创建(Fork)一个子服务器响应这个连接,而主服务器继续监听其他的服务请求。1.独立运行的守护进程独立运行的守护进程由init脚本负
2016-11-14 18:00:12
509
转载 进程学习:4-守护进程的出错记录
一、守护进程的出错记录 守护进程不像普通程序,在调试的时候可以使用gdb或是在编译的时候出现在终端上的报错原因和行号,所以在编写守护进程的时候出错处理就变得十分重要。 所以守护进程就有它自己的出错记录方式,一般有三种方式产生出错日志:1. 内核例程可以调用log函数,但是这一方式牵涉到内核,暂不研究2. 调用syslog函数产生日志消息,这个
2016-11-14 17:31:27
936
原创 进程学习:3-进程组、会话、守护进程
进程组 一个或多个进程的集合 进程组ID: 正整数 两个函数 getpgid(0)=getpgrp() eg:显示子进程与父进程的进程组id1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 5 int main() { 6 pid_t pid; 7 8 if
2016-11-13 13:42:29
585
转载 进程学习:2-
进程组、会话与终端(1).每个进程都属于一个进程组。进程组是一个或多个进程的集合,通常它们与一组作业相关联,可以接受来自同一终端的各种信号。每个进程组都有唯一的进程组ID(整数,也可以存放在pid_t类型中)。 #include <unistd.h> pid_t getpgrp(void); //返回值;调用进程的进程组ID每个进程组都有一个组长进程,组长进程的标识是进程组I
2016-11-13 13:34:05
368
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人