打开文件描述符的方法

打开文件描述符的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
open
creat
openat
creat64 / open64
socket

pipe: 用于创建一个管道,并返回两个文件描述符,分别用于读取和写入。
int pipe(int pipefd[2]);
pipefd 参数是一个整型数组,包含两个文件描述符,pipefd[0] 用于读取数据,pipefd[1] 用于写入数据

dup / dup2: 这些函数用于复制文件描述符。dup() 复制给定的文件描述符,并返回一个新的文件描述符,dup2() 则将给定的文件描述符复制到指定的文件描述符
int dup(int oldfd);
int dup2(int oldfd, int newfd);

memfd_create():在内存中创建一个无名文件,并返回一个文件描述符
int memfd_create(const char *name, unsigned int flags);
name 参数是文件名(仅用于调试目的),flags 参数用于指定标志和选项。成功时返回一个非负整数的文件描述符,失败时返回-1。

eventfd():创建一个用于事件通知的文件描述符。
int eventfd(unsigned int initval, int flags);
initval 参数是初始计数器值,flags 参数用于指定标志和选项。成功时返回一个非负整数的文件描述符

accept():用于接受传入的连接请求,并创建一个新的套接字文件描述符来处理该连接。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
sockfd 参数是监听套接字的文件描述符,addr 和 addrlen 参数用于接受连接的远程地址。成功时返回一个非负整数的文件描述符,失败时返回-1。

inotify_init():用于初始化一个新的 inotify 实例,并返回一个文件描述符。inotify 是一种文件系统监控机制,可以用于监听文件或目录的变化
int inotify_init(void);
成功时返回一个非负整数的文件描述符,失败时返回-1。

timerfd_create():创建一个用于定时器事件的文件描述符
int timerfd_create(int clockid, int flags);
clockid 参数指定定时器使用的时钟源,flags 参数用于指定标志和选项。成功时返回一个非负整数的文件描述符,失败时返回-1。

等等,太多了

backtrace 接口详细说明

backtrace 接口详细说明

我们经常会有需求来获取调用的堆栈,来排查一些问题,或者实现一些需求。本文来介绍 backtrace()backtrace_symbols() 函数的使用。

1
2
3
4
5
#include <execinfo.h>

int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *buffer, int size);
void backtrace_symbols_fd(void *const *buffer, int size, int fd);
  • backtrace() 获取函数调用堆栈数据,数据放在 buffer 中,参数 size 用来指定 buffer 中可以保存多少个 void* 元素(每个栈帧的地址)。如果回溯的函数调用个数大于 size,则只有 size 个函数调用地址被返回。因此保证一个适当的 buffer 和 size 的大小

查看更多

eventfd 原理与实践

eventfd 原理与实践

事件驱动是一种高效的通信机制,在 linux 中,eventfd 是一个用来通知事件的文件描述符,timerfd 是定时器事件的文件描述符。二者都是内核向用户空间的应用发送通知的机制,可以高效的用来实现用户空间的事件/通知驱动的应用程序。

用于进程间通信和同步。他的主要作用是通过文件描述符来实现进程间的时间通知机制,类似于信号量或者条件变量,但比他们更加高效和简单。如下的使用场景:

  • 线程同步:可以用 eventfd 实现线程间的同步,其中一个线程向 eventfd 写入数据,另一个线程从 eventfd 中读取数据,实现数据传输和同步。
  • 进程间通信:可以用 eventfd 实现进程间通信,其中一个进程向 eventfd 写入数据,另一个进程从 eventfd 中读取数据,实现进程间数据传输和同步。
查看更多

mlock 相关函数详解

mlock 相关函数详解

一、mlock 和 munlock

mlock 用于对内存加锁,锁住内存是为了防止这段内存被操作系统 swap 掉。此操作只有 root 权限才能运行

1
2
3
4
5
#include <sys/mman.h>

int mlock(const void *addr, size_t len);
int mlock2(const void *addr, size_t len, int flags);
int munlock(const void *addr, size_t len);

系统调用 mlock 类函数允许程序在物理内存上锁住他的部分或者全部地址空间。这会阻止 linux 将这个内存页调度到交换空间(swap space),即使程序已有一段时间没有访问这段空间。

举一个例子:内存页面的换入换出的时间延迟可能太长或者不可预知,安全性要求比较高的应用程序可能希望防止敏感的数据被唤出到交换空间,因此,攻击者可能从交换空间中恢复出这些数据。

查看更多

设置 core_pattern

设置 core_pattern

我们的程序 core 之后,我们想要得到 core dump 文件。一般需要设置 core 文件大小;然后设置 core 文件位置。

使用 ulimit -c 查看 core 文件大小。使用 ulimit -c unlimited 设置允许 core 文件的大小。

设置 core 文件位置。在 ubuntu 上,

1
2
3
4
cat /etc/sysctl.conf
向这个文件写入
kernel.core_pattern = ./core.%e.%p.%t
sudo sysctl -p

查看更多