Linux
文章平均质量分 76
lycclsltt
这个作者很懒,什么都没留下…
展开
-
mac 使用国内镜像的docker
docker pull registry.docker-cn.com/lycclsltt/centos_dev:latest前面加 registry.docker-cn.com为了永久性保留更改,您可以修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。{ "registry-mirrors": ["https://registry.doc...原创 2018-05-03 17:49:02 · 2291 阅读 · 0 评论 -
数据报截断
当一个到达的UDP数据报超过应用程序提供的缓冲区容量时,recvmsg在其 msghdr结构的msg_flags成员上设置MSG_TRUNC标志。所有支持msghdr结构及其msg_flags成员的实现都提供这种通知。但并非所有实现都以同一种方式处理超过预期长度的UDP数据报存在三种情况:1.丢弃超出部分的字节并向应用进程返回MSG_TRUNC标志,调用recvmsg可以接收这个标志原创 2014-06-17 15:22:13 · 1547 阅读 · 0 评论 -
udp套接字使用信号驱动式I/O
信号驱动式I/O的本质就是:进程预先告知内核当某个描述符发生事件时,内核会向该进程发送SIGIO信号通知进程,进程可在信号处理函数中进行处理进程可以通过fcntl打开O_ASYNC标志或ioctl打开FIOASYNC标志来通知内核,二者的区别是一些系统不支持fcntl,所以应尽量使用ioctl对于TCP套接字产生SIGIO信号的条件:1.监听套接字上有新连接请求完成原创 2014-07-22 20:00:26 · 2341 阅读 · 0 评论 -
ioctl获取网络接口信息
linux下网络程序经常在启动执行后使用ioctl获取主机的全部网络接口信息,例如接口地址、是否支持广播,是否支持多播等。函数原型#include int ioctl(int d, int request, ...);返回值:成功返回0,出错返回-1 常见选项SIOCGIFCONF 获取所有接口的列表SIOCGIFBRDADDR 获取广播地址S原创 2014-06-09 23:26:39 · 3077 阅读 · 0 评论 -
MSG_PEEK标志
MSG_PEEK标志可以用来读取套接字接收队列中可读的数据,一些情况会用到它,比如为了避免不阻塞而先检查套接字接收队列中可读的数据长度,再采取相应操作。当然,不阻塞也可采取其他的方法,例如非阻塞式I/O。MSG_PEEK标志会将套接字接收队列中的可读的数据拷贝到缓冲区,但不会使套接子接收队列中的数据减少,常见的是:例如调用recv或read后,导致套接字接收队列中的数据被读取后而减少,原创 2014-06-06 21:34:29 · 8401 阅读 · 0 评论 -
用udp实现广播通信
特点:1.数据传输不用建立连接,所以不可靠(符合udp协议的特点)2.数据的发送是面向整个子网的,任何一台在子网内的计算机都可以接收到相同的数据;3.广播用于udp和原始IP,不能用于TCP用途:1.定位本地子网内的主机前提是已知该主机位于本地子网,但是不知到他的单播地址。例如通过广播向所有子网内的主机的某端口发送数据报,如果主机有进程在该端口等待接收数据并回射数据,那原创 2014-06-25 16:25:12 · 12586 阅读 · 1 评论 -
socket抓取网页
#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;void func(){ string url; cout << "输原创 2014-04-29 10:58:58 · 1427 阅读 · 0 评论 -
UDP中使用connect函数
先看一个例子,下面是一个采用UDP协议的客户程序,调用sendto向服务器端发送数据,而服务器并不启动,sendto返回,表示套接字缓冲区中有可用空间,程序会阻塞在recvfrom。net.h #ifndef MY_NET_H #define MY_NET_H #include #include #原创 2014-04-24 12:34:30 · 2591 阅读 · 1 评论 -
fork()后父子进程共享文件
fork函数的特点概括起来就是“调用一次,返回两次”,在父进程中调用一次,在父进程和子进程中各返回一次。fork的另一个特性是所有由父进程打开的描述符都被复制到子进程中。父、子进程中相同编号的文件描述符在内核中指向同一个file结构体,也就是说,file结构体的引用计数要增加。下面展示了一个返回本地时间给客户的简单客户-服务器模型,其中服务端为了并发处理来自客户的请求会调用fork创建原创 2014-04-10 11:04:18 · 1983 阅读 · 0 评论 -
通过fstat函数判断描述符类型
fstat函数用于返回关于文件的信息到一个struct stat结构中,stat结构中的st_mode可以用来区分文件类型。struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode原创 2014-05-08 18:49:53 · 1127 阅读 · 0 评论 -
套接字设置超时总结
涉及套接字I/O操作上设置超时的方法:1.调用alarm原创 2014-05-06 12:34:04 · 3043 阅读 · 0 评论 -
心跳机制详解
应用场景:在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活什么是心跳机制?就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有...原创 2014-07-06 12:31:15 · 28811 阅读 · 1 评论 -
SO_REUSEADDR 套接字选项应用实例
网络上关于SO_REUSEADDR套接字选项用来解决地址重用问题的资料不少,但只停留在文字表达上,并没有实例,很容易误导初学者,并产生疑惑,此处不再赘述。下面通过一个简短的例子来展示如何在项目中合理的使用该选项,以及需要注意的问题。关于TCP断开连接四次握手,如图所示应用场景:之前项目中遇到一个问题,聊天服务器的开启,关闭和重启,例如将服务器原创 2014-07-08 00:33:48 · 3325 阅读 · 0 评论 -
linux 生成动态库时提示relocation R_X86_64_32 against `.rodata' can not be used when making a shared object;
linux生成动态库时遇到了relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC错误。由于我的系统是AMD64位的,所以需要在编译的时候添加 -fPIC选项解决方法:例如:g++ -c -fPIC head.cpp原创 2014-07-09 20:01:45 · 35898 阅读 · 3 评论 -
linux给指定用户发消息
一、给指定用户发送消息 首先,可使用w或who命令查看当前登录的用户信息; 然后,使用write命令将信息发送到用户的终端上,用法步骤如下:1、write + shh登陆用户名+ttyname(例如pts/1)2、ENTER3、输入信息(所要发送的消息,中文可能会乱码)。4、EOF5、CTRL+D6、结束...原创 2018-03-06 16:12:09 · 1741 阅读 · 0 评论 -
nginx实现负载均衡和健康检查
安装pcre1.下载pcer-8.36.tar.gz2.解压3.apt-get update4.apt-get install gcc5.apt-get install build-essential6./configure7.make8.make install9.下载nginx10.apt-get install zlib1g.dev11../con原创 2015-07-18 23:59:23 · 9858 阅读 · 0 评论 -
logrotate切割日志文件
logrotate是linux上自带的强大的日志管理工具,通过logrotate可以进行日志的定期切割、压缩、备份等。logrotate的配置文件位置在/etc/logrotate.conf中,自定义配置文件位于/etc/logrotate.d目录下下面是一个简单的配置例子,实现每天切割日志/root/test/test.log #日志文件路径原创 2015-07-28 23:22:36 · 9738 阅读 · 0 评论 -
后台进程管理工具---supervisor
supervisor是一个linux下的进程管理工具,有时需要开发一些后台服务类的程序,这类程序通常不能因为意外挂掉,所以最好能在出现意外挂掉的情况下能够重启,继续服务。之前我一直采用创建daemon,即守护进程的方式来实现,再通过其他进程监控,最近发现了这个后台进程管理神器。通过supervisor,可以将命令行的控制台程序轻松变为daemon,并且在意外挂掉时,supervisor能够自动帮我原创 2015-07-27 23:10:20 · 10550 阅读 · 1 评论 -
linux 下cocos2dx-3.3.1环境搭建
1.安装依赖依赖包括:libx11-devlibxmu-devlibglu1-mesa-devlibgl2ps-devlibxi-devg++libzip-devlibpng12-devlibcurl4-gnutls-devlibfontconfig1-devlibsqlite3-devlibglew*-devlibssl-dev如果你的系统是Ubuntu/原创 2014-06-21 16:24:49 · 2025 阅读 · 2 评论 -
nagle算法初识
问题:TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。例如想发送1字节数据,加上20字节的TCP头部,20字节的IP头部,需要发送41字节的数据,浪费网络带宽,为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。N转载 2014-10-27 09:59:00 · 9035 阅读 · 0 评论 -
非阻塞connect
一、用途:1.提高程序效率默认情况下connect函数是阻塞的,它发起TCP连接的三路握手。完成一个connect需要花费一个RTT时间(从本地主机到对端再回到本地),RTT的波动范围很大,局域网上几毫秒到几百毫秒,广域网上甚至能需要几秒,这对计算机来说是非常漫长的时间,这段时间可以用来执行其他的处理工作,提高效率。因此非阻塞的connect函数是必要的。2.同时建立多个连接,不必原创 2014-06-07 10:47:44 · 1507 阅读 · 0 评论 -
几种服务器模型
TCP测试用客户程序每次运行客户程序,在命令行参数指定服务器的ip地址,端口,发起连接的子进程数,和一个待发送的字符串数据,客户程序将模拟多个客户根据指定的子进程数创建子进程来并发的连接到服务器,并发送数据,服务器收到数据后都原样的回发给客户,是一点典型的回射服务器。#include "net.h"char *addr = NULL;char *request = NULL;...原创 2014-08-30 20:37:29 · 2891 阅读 · 0 评论 -
setjmp与longjmp
在C中有时我们会使用goto语句用于执行跳转,但是不能跨越函数#include void func2(){ int num = 0;dst2: if (num > 0) { printf("func1()\n"); func3(); } if (num == 1) return; num++; goto dst2;}void func3(){}原创 2014-06-18 22:40:36 · 1082 阅读 · 0 评论 -
shutdown函数
发送一行文本给服务器,然后等待应答,这就形成了一个简单的回射服务器。如果把客户和服务器之间的网络作为全双工管道考虑,请求从客户向服务器发送,应答从服务器回发给客户。下图展示了客户与服务器之间的数据分组,忽略网络中的TCP确认(ACK)。原创 2014-04-18 20:25:35 · 1993 阅读 · 0 评论 -
I/O复用模型之select
在编程中我们用到最多的是阻塞式I/O模型。例如,进程调用recvfrom,它直到数据报到达后从内核缓冲区复制到进程缓冲区才返回。若没有数据报到达,或者没有复制到进程缓冲区,recvfrom将一直阻塞。也有可能被信号中断,而返回。例如进程调用fgets,直到用户输入回车后才后返回。否则将一直阻塞。而I/O复用模型在一定程度上可以解决这样的问题。什么是I/O复用呢?编程时要同时处理多个原创 2014-04-18 17:36:31 · 1618 阅读 · 0 评论 -
I/O复用模型之poll
poll提供的功能与select类似,poll效率高。原型:#include int poll(struct pollfd *fds, nfds_t nfds, int timeout); 返回值:若有就绪描述符则为其数目,超时则为0,出错为-1参数:nfds:struct pollfd数组中元素的个数timeout:指定poll函数返回前等待的毫秒数IN原创 2014-04-19 15:02:04 · 1208 阅读 · 0 评论 -
linux进程间通信之消息队列
消息队列是消息的链表,存放在内核中并由消息队列标识符标识。对于系统中的每个消息队列,内核维护一个定义在头文件中的信息结构struct msqid_ds { struct ipc_perm msg_perm; /* 相关权限 */ time_t msg_stime; /* 上一次发送时间 */ time_t msg原创 2014-03-11 10:18:57 · 1657 阅读 · 2 评论 -
linux进程间通信之共享内存
共享存储允许两个或多个进程共享同一给定的存储区。因为数据不需要在客户进程和服务器进程之间复制,所以这是最快的一种IPC。使用共享存储时要注意多个进程之间对同一给定存储区的同步访问.内核为每个共享存储段设置了一个shmid_ds结构struct shmid_ds{ struct ipc_perm shm_perm; /*操作权限*/ int shm原创 2014-03-10 13:58:48 · 1342 阅读 · 0 评论 -
linux下获取系统环境变量
在c,main函数的前两个参数argc, argv被很多人熟悉,但main函数还有第三个参数------arge。main的第三个参数里存的是系统变量,所以可以通过这个参数获得系统环境变量#include int main(int argc, char** argv, char** arge){ while(*arge) { printf("%s\n", *arge++)原创 2014-03-05 15:41:09 · 2134 阅读 · 0 评论 -
linux线程同步之信号量
初始化信号量 int sem_init(sem_t *sem, int pshared, unsigned int value);sem_init() 初始化一个定位在 sem 的匿名信号量。value 参数指定信号量的初始值。 pshared 参数指明信号量是由进程内线程共享,还是由进程之间共享。如果 pshared 的值为 0,那么信号量将被进程内的线程共享,并且应该放置原创 2014-02-26 14:14:15 · 1281 阅读 · 0 评论 -
linux线程同步之读写锁
读写锁实际是实现保护共享资源而提出一种锁机制。 它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时既有读者又有写者。原创 2014-02-26 15:02:34 · 1380 阅读 · 1 评论 -
linux多线程实现黑客帝国字符滑屏效果
利用curses库来实现字符界面的改变,利用多线程实现每个字符的改变设计思想:以整个屏幕为背景,随机生成26个字母以及每个字母初始的x,y值以及speed速度值,通过改变字符的y值,清屏并重绘,来实现字符的滑屏效果最初线程设计思想:创建26个线程,每个线程控制一个字母,线程函数中根据y值清屏并重绘字符,对重绘过程采用互斥量加锁,由于清屏操作也会涉及到线程同步,故实现较为麻烦。原创 2014-02-25 21:37:20 · 1958 阅读 · 0 评论 -
linux线程同步之条件变量
条件变量是线程可用的另一种同步机制。条件变量给多个线程提供了一个会合的场所。条件本身是由互斥量保护的。线程在改变 条件状态前必须首先锁住互斥量。条件变量的初始化 pthread_cond_init去除初始化 pthread_cond_destroy等待 pthread_cond_wait满足条件给向进程发送信号 pthread_cond_signal下面程序展示原创 2014-02-25 12:26:16 · 1014 阅读 · 1 评论 -
linux线程同步之信号
linux中向某个线程发送信号,若没有对该信号的处理函数,则会导致程序结束。如下面的程序,创建一个线程,主线程向其发送一个信号,会导致程序立即结束#include #include pthread_t t;void* run(void* arg){ while(1) { printf("Hello\n"); }}main(){ pthread_cre原创 2014-02-25 11:21:40 · 1177 阅读 · 0 评论 -
linux线程同步之互斥锁
当程序中存在多个线程时,如果每个线程使用的变量都是其他线程不会读取或修改的,那么就不存在一致性问题。如果变量是只读的,多个线程访问也不会有不一致问题。但是,当某个线程可以修改变量,而其他线程也可以读取或修改该变量时,为了确保数据存储时不会访问到无效的值,为了避免脏数据,就需要对这些线程进行同步。该程序中每个线程分别对共享变量进行+1并且比较,体现了多线程访问共享资源时读写造成的原创 2014-02-24 21:13:25 · 1048 阅读 · 0 评论 -
strerror
经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因。这个时候使用errno这个全局变量就相当有用了。在程序代码中包含 #include ,然后每次程序调用失败的时候,系统会自动用用错误代码填充errno这个全局变量,这样你只需要读errno这个全局变量就可以获转载 2013-11-17 22:34:09 · 928 阅读 · 0 评论 -
linux目录操作
获取当前路径#include char *getcwd(char *buf, size_t size);char *getwd(char *buf);char *get_current_dir_name(void);这些函数都返回程序到当前工作路径get_current_dir_name() 将通过malloc申请一段足够大的空间来存放当前路径。getwd()原创 2014-03-05 17:36:54 · 954 阅读 · 0 评论 -
linux进程间通信之实名管道
pipe函数建立的管道实际上是个匿名管道,由内核负责维护的一块存储区域。半双工通信,而且只能用于共同祖先进程之间。通过FIFO,不相关的进程也能交换数据。FIFO实际上是一种文件类型,打开的描述符号可以读写(two-way双工)。#include #include int mkfifo(const char *pathname, mode_t mode);返回值: 成功返回0原创 2014-03-09 11:34:07 · 1863 阅读 · 0 评论 -
linux进程间通信之匿名管道
管道是UNIX系统IPC最古老的形式,并且所有UNIX系统都提供此种通信机制。管道有下面两种局限性。1.历史上,它们是半双工的,数据只能在一个方向上流动2只能在公共祖先的进程之间使用。例如,父子进程之间就可应用管道。尽管有这两种局限性,半双工管道仍是最常用的IPC形式管道是用pipe函数创建的#include int pipe(int pipefd[2]);原创 2014-03-08 13:06:49 · 1315 阅读 · 0 评论 -
创建守护进程
在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程。守护进程是在后台运行不与任何控制终端关联,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。大多数服务都是通过守护进程实现的。它从被执行开始运转,直到整个系统关闭时才退出。如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就原创 2014-05-02 15:03:13 · 1220 阅读 · 0 评论