linux
不闻窗外事
学无止境
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
timerfd
始于版本2.6.25,Linux内核提供了另一种创建定时器的API。Linux特有的timefd API,可从文件描述符中读取其所创建定时器的到期通知。因为可以使用select()、poll()和epoll()将这种文件描述符会同其他描述符一同进行监控,所以非常实用。这组API中的3个新系统...原创 2020-11-05 09:48:29 · 540 阅读 · 0 评论 -
标准IO缓冲
摘抄自《UNIX环境高级编程》 标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。遗憾的是,标准I/O库最令人迷惑的也是它的缓冲。 标准I/O提供了以下3种类型的缓冲。 (1)全缓冲。在这种情况下,在填满标准I/O缓冲区后才进行实际I/O操作。对于驻留在磁盘上的文件通常是由标准I/O库实施全缓冲的。在一个流上执行第一次I/O操作时,相关标准I/O函数通常调用malloc获得需使...原创 2020-10-12 16:17:39 · 1537 阅读 · 0 评论 -
关于signal信号处理接口会自动重启中断的系统调用
前段时间看《UNIX网络编程》的时候,想使用alarm中断像read、accept之类的阻塞调用。当时大体上是这样实现的:signal(SIGALRM, handler);struct sockaddr_in cliaddr;socklen_t clilen = sizeof(cliaddr);alarm(5);int connfd = accept(listen_fd, (struct sockaddr *)&cliaddr, &clilen);为了简单,使用的sign原创 2020-09-25 14:58:40 · 693 阅读 · 0 评论 -
组播的使用实例
我发现网上关于组播的例子不多,而且有的在我所用的系统上还有问题,所以把我自己写的简单例子记录一下。前面有两篇关于组播的博客,这是连续的第三篇,就当作一个系列吧。。。服务端(接收端)#include "../common/common.h"#include <netdb.h>#define MAXLINE 1024int main(int argc, char *argv[]){ if (argc != 4) { printf("usage:原创 2020-09-19 08:57:29 · 1354 阅读 · 0 评论 -
sendto: Network is unreachable以及发送组播的一些问题
上一篇写了关于接收组播遇到的问题和解决方法,实际上在编写发送组播的代码时也遇到过一些问题,根据《UNIX网络编程》和我网上的一些实例,在发送组播时不需要做任何特殊处理,只要跟发送普通udp时一样,指定一个地址和端口号即可。一般情况下,客户端向服务端发包是不需要绑定的。但是我使用之前的一个简单udp客户端,指定ip时使用组播包,在两个操作系统出现了两种情况,但没有一种是成功的。第一种情况是报sendto: Network is unreachable的错误;第二种情况是不报错,但是接收端收不到包。处于上一原创 2020-09-19 08:47:01 · 5314 阅读 · 0 评论 -
setsockopt: No such device的解决方法以及组播的基本使用
最近在学习组播时,遇到一个报错,setsockopt: No such device,根据网上的说法,原因是这样的:1、机器没有可用的组播功能2、没有为主机添加路由,有些系统不添加默认情况。你需要在终端下输入:route add -net 224.0.0.0 netmask 224.0.0.0 eth0(or similar).但是这两个答案我都不怎么满意,因为之前已经有包含组播的程序在运行了。而报错的代码是这样的一段: struct ip_mreq ipmr; ipmr.原创 2020-09-18 16:49:03 · 7974 阅读 · 0 评论 -
linux文件遍历的简单实现
#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <dirent.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <libgen.h>#define PRINT_RED.原创 2020-09-18 10:39:46 · 389 阅读 · 0 评论 -
在替换可执行程序和库时遇到的关于cp和install的问题
在makefile文件中,经常会使用install安装库或者可执行程序;平时也经常使用cp命令进行替换库或者可执行程序,但是如果可执行程序属于运行状态,使用cp就会失败,显示文件正忙。有时候替换库文件会造成调用库的程序core掉。基于这些原因,查了一下cp和install的区别,以及core的原因。创建了两个目录,一个目录1,一个目录2,在两个目录中都创建了一个1.txt文件,并写入一些简单内容,在目录1使用命令strace cp 1.txt ../2/将文件拷贝到目录2,看到最后几行输出是..原创 2020-09-16 14:06:07 · 576 阅读 · 0 评论 -
使用C++实现的简单ini文件操作
因为经常使用配置文件,为了方便之后的使用,决定自己写一个功能比较齐全的操作ini类型的配置文件,因为是在linux 环境使用,所以是针对linux系统的文件。写代码加上测试,花了几天时间,博客记录一波。水平有限,可能有不少问题,希望大佬可以指正。如果有人想使用,一定要自己好好测试。。。代码分为两个文件,头文件iniparser.h代码如下:/*[section] //section 段key = value //item程序说明: 1、本程序提供的返回值为int类原创 2020-08-30 20:50:24 · 1881 阅读 · 0 评论 -
TCP状态
摘抄自《Linux/UNIX系统编程手册》维护一个TCP连接需要同步协调这个连接的两端。为了减小这项任务的复杂度,TCP节点以状态机的方式来建模。这意味着TCP节点可以处于一组固定状态中的其中一种,并且根据对事件的响应来从一种状态迁移到另一种状态。比如可根据TCP上层的应用程序所执行的系统调用,又或者是从对端TCP节点接收到了TCP报文。TCP的状态有如下几种:LISTEN:TCP正等待从对端TCP节点发来的连接请求 SYN_SENT:TCP发送了一个SYN报文,代表应用程序执行了一个主动打开的操原创 2020-08-20 14:59:59 · 214 阅读 · 1 评论 -
对fopen使用“a”参数的新的认识
FILE *fopen(const char *path, const char *mode);当mode是“a”时,表示“打开文件,用于追加 (在文件尾写)。如果文件不存在就创建它。流被定位于文件的末尾”。这一点没什么问题,但是按照我之前的理解,我认为当我打开文件后,如果不操作的话文件的偏移量不变,那么如果当有两个进程或者线程同时追加内容,应该是会发生覆盖的。例如,进程A以“a”的形式...原创 2020-05-08 14:27:39 · 5925 阅读 · 0 评论 -
对于pthread_kill的一些误解
今天在写代码的时候,想通过pthread_kill接口杀死一个线程,因为之前学习《Linux/Unix系统编程手册》的时候,里面对于该接口的功能介绍是如下:函数pthread_kill()向同一进程下的另一线程发送信号。因为仅在同一进程中可保证线程ID的唯一性,所以无法调用pthread_kill向其他进程中的线程发送信号。所以就感觉pthread_kill与kill差不多,不过一个是向线...原创 2020-04-17 15:20:57 · 1521 阅读 · 0 评论 -
select函数当对端关闭后的状态
struct timeval timeout = {5, 0}; rset = allset; nready = select(maxfd + 1, &rset, NULL, NULL, &timeout);当使用select等待客户端发送数据时,如果客户端断开了连接,无论是主动close还是程序挂掉了,这时候select都...原创 2018-08-07 18:03:09 · 3616 阅读 · 4 评论 -
可重入和不可重入函数、异步信号安全函数、线程安全函数
要解释可重入函数为何物,首先需要区分单线程程序和多线程程序。典型UNIX程序都具有一条执行线程,贯穿程序始终,CPU围绕单条执行逻辑来处理指令。而对于多线程程序而言,同一进程却存在多条独立、并发的执行逻辑流。如果同一个进程的多条线程可以同时安全的调用某一函数,那么该函数就是可重入的。此处,“安全”意味着,无论其他线程调用该函数的执行状态如何,函数均可产生预期结果。SUSv3对可重入函数的定...原创 2019-04-03 13:17:58 · 2761 阅读 · 0 评论 -
如何输入文件结束符
对于指出文件结束,不同操作系统有不同的约定。在Windows系统中,输入文件结束符的方法敲Ctrl+Z,然后按Enter或Return键。在UNIX系统中,包括Mac OS X系统中,文件结束符输入是用Ctrl+D。...原创 2019-05-15 17:48:50 · 8310 阅读 · 0 评论 -
__attribute__((format(printf, a, b)))
转载:https://blog.youkuaiyun.com/huangjh2017/article/details/76944564 最近,在看libevent源码,第一次看到__attribute__((format(printf, a, b)))这种写法。因此,在这里记录下用法。 功能:__attribute__ format属性可以给被声明的函数加上类似printf或者scanf的特征,它...转载 2019-06-06 09:59:47 · 400 阅读 · 0 评论 -
gcc编译选项-fPIC
-fPIC选项指定编译器应该生成位置独立的代码,这会改变编译器生成执行特定操作的代码的方式,包括访问全局、静态和外部变量,访问字符串常量,以及获取函数的地址。这些变更使得代码可以在运行时被放置在任意一个虚拟地址处。这一点对于共享库来讲是必需的,因为在链接的时候是无法知道共享库代码位于内存的何处的。(一个共享库在运行时所处的内存位置依赖于很多因素,如加载这个库的程序已经占用的内存数量和这个程序已经加...原创 2019-06-26 12:47:41 · 2513 阅读 · 0 评论 -
install命令和cp命令的区别
转载自:https://www.cnblogs.com/duanxz/p/5037643.html基本上,在Makefile里会用到install,其他地方会用cp命令。它们完成同样的任务——拷贝文件,它们之间的区别主要如下:1、最重要的一点,如果目标文件存在,cp会先清空文件后往里写入新文件,而install则会先删除掉原先的文件然后写入新文件。这是因为往正在使用的文件中写入内容可能...转载 2019-06-26 16:11:49 · 625 阅读 · 0 评论 -
jiffies和clock tick
最近在看sysstat的代码时,被两个时间单位整的有点晕。在sysstat源码中,在读取/proc/stat和/proc/pid/stat的时间时,作者在程序说明中使用的是jiffies概念,但是实际上man proc看的时候,这个值是clock tick,而且在源码中使用的也是通过sysconf(_SC_CLK_TCK)获取的频率。我不知道为什么作者要以这种容易发生混乱的方式来注解代码,因为通过...原创 2019-08-19 17:01:17 · 1012 阅读 · 0 评论 -
linux获取IP、子网掩码、广播IP
#include <arpa/inet.h>#include <sys/socket.h>#include <netdb.h>#include <ifaddrs.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(i...原创 2019-09-03 14:25:27 · 755 阅读 · 0 评论 -
线程实现模型
线程实现有3种不同模型,这3种实现模型的差异主要集中在线程如何与内核调度实体(KSE,Kernel Scheduling Entity)相映射。KSE是内核分配CPU以及其他资源的(对象)单位。模型一:多对一(M:1)实现(用户级线程)在M:1线程实现中,关乎线程创建、调度以及同步(互斥量的锁定,条件变量的等待等)的所有的细节全部由进程内用户空间(user-space)的线程库来处理。对于...原创 2019-03-26 18:43:43 · 469 阅读 · 0 评论 -
线程与exec、fork、exit
线程与exec只要有任一线程调用了exec()系列函数之一时,调用程序将被完全替换。除了调用exec()的线程之外,其他所有线程都将立即消失。没有任何线程会针对线程特有数据执行结构函数,也不会调用清理函数。该进程的所有互斥量(为进程私有)和属于进程的条件变量都会消失。调用exec()之后,调用线程的线程ID是不确定的。线程和fork当多线程进程调用fork()时,仅会将发起调用的线程复...原创 2019-03-26 18:12:24 · 1683 阅读 · 0 评论 -
关于fork与信号的小测试
之前有一个疑问,就是在使用fork的多进程的程序中,如果其前台,并通过ctrl-c企图终止该进程,那么父进程与子进程是否都会捕获到信号,于是做了一个小测试,代码如下:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>void signa...原创 2019-03-26 13:13:06 · 213 阅读 · 0 评论 -
使用fopen的a+参数遇到的问题
在《UNIX环境高级编程》这本书中,关于a+的解释是这样的:为在文件尾读和写而打开或创建。也就是说是在文件尾部读和写。最近需要写一下程序,打开一个10M大小的文件,随机位置写入一串数据。当时我就是用的a+,结果调了好久,即使使用fseek调整位置,但是每次都是在文件末尾添加内容,后来换成了r+才解决。所以特意又man了一下fopen,结果发现a+的解释为:Open for reading an...原创 2018-09-18 18:36:42 · 4471 阅读 · 2 评论 -
ipcs只能用来 查看SystemV的IPC信息
之前一直以为ipcs可以查看所有的ipc信息,包括System V和Posix的。但是最近在做测试的时候突然发现ipcs只能显示System V的信息,并不能显示Posix的信息。如果man ipcs的话,有这么一句话 The Linux ipcs utility is not fully compatible to the POSIX ipcs utility. 但是不知道这个所谓的不兼容是指...原创 2018-09-03 14:53:36 · 688 阅读 · 0 评论 -
关于malloc的返回地址
之前没注意过malloc的返回值,今天又看到了这个地址空间说明,根据《LINUX/UNIX系统编程手册》的说明,当使用malloc申请比较小的空间时,返回值应该位于0x40000000以内,而当malloc申请的空间比较大时,会使用mmap的私有匿名映射实现,所以malloc的返回值应该大于0x40000000,于是写了一个简单的程序,发现确实是这样,程序入下:#include <...原创 2018-09-03 13:53:17 · 3038 阅读 · 0 评论 -
包含时间、行号、文件名等信息的打印
#include <stdio.h>#include <stdlib.h>#include <time.h>#include <unistd.h>#include <sys/types.h>#include <errno.h>#include <string.h>#define debug_out(原创 2018-08-07 10:48:09 · 373 阅读 · 0 评论 -
关于strtok、strtok_r和strsep的速度问题
之前查strtok和strsep函数时,看到了这么一段话: 下面的说明摘自于最新的Linux内核2.6.29,说明了strtok()已经不再使用,由速度更快的strsep()代替。/** linux/lib/string.c** Copyright (C) 1991, 1992 Linus Torvalds*/ /** stupid library routines.. The...原创 2018-08-02 14:26:20 · 807 阅读 · 0 评论 -
使用setsockopt TCP_NODELAY禁用 Nagle算法
转载自:https://blog.youkuaiyun.com/yahohi/article/details/6717500 Nagle算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程(称为Nagling),通过减少必须发送的封包的数量,提高了网络应用 程序系统的效率。(Nagle虽然解决了小封包问题,但也导致了较高的不可预测的延迟,同时降低了吞吐量。)vc下面socket编程,使用阻塞方...转载 2018-07-24 12:21:00 · 4410 阅读 · 0 评论 -
TCP长连接保持连接状态TCP keepalive设置
出处:http://blog.youkuaiyun.com/embedded_sky/article/details/42077321 对于TCP长连接保活是十分必要的,原因如下: 1、系统多在OA网和外网间有防火墙隔离,很多防火墙对一段时间内没有报文活动的socket会自动关闭。 2、对于非正常断开的连接系统并不能侦测到,比如防火墙关闭端口、网线被拔掉、电脑突然奔掉...转载 2018-07-24 12:13:49 · 6546 阅读 · 0 评论 -
通过路径的方式对树进行增删改查
最近需要写一个树,通过路径的方式对树进行增删改查,但是在网上很少有以路径的方式对树进行操作的例子,所以周末自己写了一下,实现了增删改查接口以及测试程序。下面是一些介绍1、树的结构体//树的节点结构体struct NODE{ char name[NAME_LEN]; //节点名字 char pathname[PATH_LEN]; //该节点在树中的绝对路径...原创 2018-10-21 15:11:01 · 268 阅读 · 0 评论 -
关于cmdline文件的中的执行命令
linux文件/proc下的进程信息中,有一个cmdline文件,该文件中保持了本进程的执行命令,但是该文件中的命令比较有意思的是,当启动进程时含有参数时,会在各个参数中使用 字符'\0'进行分割,所以如何直接打印该命令,只能打印出第一个参数,即进程名,如果想打印全部参数,需要把各个参数的'\0'字符转为空格,就可以打印了。可以使用如下函数得到该命令int get_command(pid...原创 2018-11-23 13:55:02 · 2501 阅读 · 0 评论 -
孤儿进程和僵尸进程
父进程与子进程的生命周期一般都不相同,父子进程间互有长短。这就会引起孤儿进程和僵尸进程的问题孤儿进程简单的说,孤儿进程就是在子进程还未退出之前,父进程先退出了,子进程就成了孤儿进程。那么,谁会成为孤儿子进程的父进程呢?进程ID为1的众进程之祖------init会接管孤儿进程。换言之,某一子进程的父进程终止后,对getppid()的调用将返回1。这是判定某一子进程之“生父”是否“在世”的方...原创 2019-03-26 12:59:29 · 177 阅读 · 0 评论 -
linux时间函数介绍
日历时间无论地理位置如何,UNIX系统内部对时间的表示方式均是以Epoch以来的秒数来度量的,Epoch亦即通用协调时间(UTC,以前也称为格林威治标准时间,或GMT)的1970年1月1日早晨零点。这也是UNIX系统问世的大致日期。日历时间存储于类型为time_t的表两种,此类型是由SUSv3定义的整数类型。获取日历时间函数gettimeofday #include ...原创 2019-03-20 20:24:49 · 323 阅读 · 0 评论 -
关于iostat参数说明
iowait% %Idle avgqu-sz await Svctm %utilIowait值一直比较低,并且没有太大变化,说明这个值表示的是cpu用来等待io的时间,而在这次测试中,用的数据量是1k,所以速度很快,不会发生严重的io阻塞,这个值应该是在一次的io数据比较大的情况下才会变大。在iowait的概念中,它表示在一个采样周期内有百分之几的时间属于以下情况:...原创 2019-03-15 21:29:50 · 1528 阅读 · 0 评论 -
测试malloc申请的内存,越界多少会coredumped
目的:测试malloc申请的内存,越界多少会coredumped 测试方法 申请不同大小的内存空间,然后不断的越界访问,直到发生coredumped,记录越界时的字节和内存地址。 环境:10.0.0.131 Size 首地址 core dumped时的访问的越界字节数 ...原创 2019-03-15 21:27:26 · 1151 阅读 · 0 评论 -
close-on-exec标志介绍
在执行exec()之前,程序有时需要确保关闭某些特定的文件描述符。尤其是在特权进程中调用exec()来启动一个未知程序时(并非自己编写),抑或是启动程序并不需要使用这些已打开的文件描述符时,从安全编程的角度出发,应当在加载新程序之前确保关闭那些不必要的文件描述符。对所有此类描述符施以close()调用就可达到这一目的,然而这一做法存在如下局限性。某些描述符可能是有库函数打开的。但库函数无法使主...原创 2019-03-07 09:28:17 · 1653 阅读 · 0 评论 -
select会屏蔽套接字本身设置的读超时
本来想使用select实现如下功能,一个服务器向几个客户端同步数据,向某一个客户端同步完数据后需要读取一次客户端的回复,但是不希望阻塞等待,感觉如果可以在需要读的时候将套接字加入select的读集合,并设置该套接字的读超时,如果该套接字超时后代表客户端没有成功回复信息。但是我不希望通过select的超时来实现这一点,因为select的超时有其他作用。但是发现这样好像并没有作用。即使设置了套接字的读...原创 2019-01-02 15:08:02 · 213 阅读 · 0 评论 -
Paxos算法
-------------------------转载自维基百科--------------------------Paxos算法是莱斯利.兰伯特(Leslie Lamport)于1990年提出的的一种基于消息传递且具有高度容错特性的一致性算法。问题和假设分布式系统中的节点通信存在两种模型:共享内存和消息传递。基于消息传递同虚拟模型的分布式系统,不可避免的会发生以下错误:进程可能会慢、...转载 2018-12-26 13:52:47 · 507 阅读 · 0 评论 -
进程内存布局
每个进程所分配的内存由很多部分组成,通常称之为“段(segment)”,细节如下所示:文本段包含了进程运行的程序机器语言指令。文本段具有只读属性,以防止进程通过错误指针意外修改自身指令。因为多个进程可同时运行同一个程序,所有又将文本段设置为可共享,这样,一份程序代码的拷贝可以映射到所有这些进程的虚拟地址空间中。 初始化数据段包含显示初始化的全局变量和静态变量。当程序加载到内存时,从可执行文件...原创 2018-12-19 16:45:05 · 356 阅读 · 0 评论
分享