首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当从timerfd_create调用有效的fd时,为什么timerfd_settime使用EBADF失败?

timerfd_create函数用于创建一个定时器文件描述符(timer file descriptor),该文件描述符可以用于设置定时器的参数和获取定时器的状态。timerfd_settime函数用于设置定时器的超时时间和间隔时间。

当timerfd_settime函数使用EBADF(Bad file descriptor)错误失败时,可能有以下几种原因:

  1. 无效的文件描述符:timerfd_settime函数要求传入一个有效的文件描述符,如果传入的文件描述符无效或已关闭,则会返回EBADF错误。在调用timerfd_create函数创建定时器文件描述符后,需要确保该文件描述符有效并且没有被关闭。
  2. 权限不足:如果当前进程没有足够的权限来操作该文件描述符,例如没有写权限或者没有对应的文件操作权限,那么timerfd_settime函数会返回EBADF错误。在使用timerfd_settime函数之前,需要确保当前进程具有足够的权限来操作该文件描述符。
  3. 文件描述符类型不匹配:timerfd_settime函数要求传入的文件描述符必须是定时器文件描述符,如果传入的文件描述符类型不匹配,例如是一个普通文件描述符或者是其他类型的特殊文件描述符,那么timerfd_settime函数会返回EBADF错误。在调用timerfd_create函数创建定时器文件描述符后,需要确保该文件描述符的类型正确。

总结起来,当从timerfd_create调用有效的fd时,timerfd_settime使用EBADF失败可能是因为无效的文件描述符、权限不足或文件描述符类型不匹配。在使用timerfd_settime函数之前,需要确保文件描述符有效、具有足够的权限,并且类型匹配。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux定时器例子

如果对你有帮助,麻烦点个在看或点个赞,感谢~ 文章首发 公众号—— Pou光明 程序中难免会使用到定时器,今天给大家介绍Linux中一种定时器实现。...Linux下还有很多其他定时实现,如精确定时等,感兴趣同志可以再做深入了解。 编程到现在,其实很多工作都是在调用api,还没能完全脱离面向“谷歌”编程实质,面对这种情形,如何破局呢?...一、api简介 NAME timerfd_create, timerfd_settime, timerfd_gettime -通过文件描述符来告知定时器状态。...int timerfd_settime(int fd, int flags, const struct itimerspec *new_value,...itimerspec *curr_value); timerfd_create() 创建一个新计时器对象,并返回对应文件描述符。

3.7K20

muduo网络库学习之EventLoop(一):事件循环类图简介和muduo 定时器TimeQueue

/ timerfd_gettime / timerfd_settime 取舍如下: • (计时)只使用gettimeofday 来获取当前时间。...muduo::Timestamp 用一个int64_t 来表示Epoch 到现在微秒数,其范围可达上下30 万年。...RVO优化:在linux g++ 会优化,VC++ 在release 模式下会优化,即函数返回对象不会调用拷贝函数。...TimerQueue 中有多个定时器,一次性和重复,事件循环开始EventLoop::loop(),最早到期定时器超时时,poll() 返回timerfd_ 可读事件(timerfdChannel...:handleRead(), 在函数内先read  掉timerfd_数据,避免一直触发可读事件,接着遍历TimerQueue中此时所有超时定时器,调用每个定时器构造传递回调函数。

1.9K00

让事件飞——Linux eventfd 原理

开发者使用eventfd相关系统调用,需要包含头文件;对于timerfd,则是。...flags可以以下三个标志位OR结果: EFD_CLOEXEC:FD_CLOEXEC,简单说就是fork子进程不继承,对于多线程程序设上这个值不会有错。...timerfd 对于timerfd,有三个涉及系统调用接口 int timerfd_create(int clockid, int flags); int timerfd_settime(int fd...考虑一个情景,两个线程几乎同时read请求,那么:两个都会被加入到等待队列中,第一个抢到自旋锁,返回了大于1res并重置了count为0,此时它会(在倒数第二个if那里) 第一间唤醒等待队列中其他线程...关键在于write函数也有当确认可以成功返回,主动调用wakeup_locked过程,这样就能实现write后立即向等待队列通知效果了。 write操作与read操作过程非常相似,不在此展开。

6.3K444

让事件飞 ——Linux eventfd 原理与实践

开发者使用eventfd相关系统调用,需要包含头文件;对于timerfd,则是。...flags可以以下三个标志位OR结果: EFD_CLOEXEC:FD_CLOEXEC,简单说就是fork子进程不继承,对于多线程程序设上这个值不会有错。...timerfd 对于timerfd,有三个涉及系统调用接口 1int timerfd_create(int clockid, int flags);int timerfd_settime(int fd...考虑一个情景,两个线程几乎同时read请求,那么:两个都会被加入到等待队列中,第一个抢到自旋锁,返回了大于1res并重置了count为0,此时它会(在倒数第二个if那里) 第一间唤醒等待队列中其他线程...关键在于write函数也有当确认可以成功返回,主动调用wakeup_locked过程,这样就能实现write后立即向等待队列通知效果了。 write操作与read操作过程非常相似,不在此展开。

4.6K31

进程间通讯(七).socket(3)

调用bind函数之后,该套接字与一个相应地址关联,发送到这个地址数据可以通过这个套接字来读取与使用 __addr 指定地址。这是一个地址结构,并且是一个已经经过填写有效地址结构。...它从内核中取出已经建立客户连接,然后把这个已经建立连接返回给用户程序,此时用户程序就可以与自己客户进行点到点通信了 __fd 指定处于监听状态流套接字,这个套接字用来监听一个端口,有一个客户与服务器连接...同样,它也可以被设置为NULL 如果accept成功返回,则服务器与客户已经正确建立连接了,此时服务器通过accept返回套接字来完成与客户通信 返回:非负描述字成功, -1失败 有人很远地方通过一个在侦听...,不会阻塞着读,因此需要循环读取) 可能错误 EAGAIN:套接字已标记为非阻塞,而接收操作被阻塞或者接收超时 EBADF:sock不是有效描述词 ECONNREFUSE:远程主机阻绝网络连接 EFAULT...;==0 对方调用了close API来关闭连接 ;<0 发送失败,错误原因存于全局变量errno中 EBADF 参数s 非合法socket处理代码 EFAULT 参数中有一指针指向无法存取内存空间

97920

网络编程(一).TCP(3)

调用bind函数之后,该套接字与一个相应地址关联,发送到这个地址数据可以通过这个套接字来读取与使用 __addr 指定地址。这是一个地址结构,并且是一个已经经过填写有效地址结构。...它从内核中取出已经建立客户连接,然后把这个已经建立连接返回给用户程序,此时用户程序就可以与自己客户进行点到点通信了 __fd 指定处于监听状态流套接字,这个套接字用来监听一个端口,有一个客户与服务器连接...,不会阻塞着读,因此需要循环读取) 可能错误 EAGAIN:套接字已标记为非阻塞,而接收操作被阻塞或者接收超时 EBADF:sock不是有效描述词 ECONNREFUSE:远程主机阻绝网络连接 EFAULT...;==0 对方调用了close API来关闭连接 ;<0 发送失败,错误原因存于全局变量errno中 EBADF 参数s 非合法socket处理代码 EFAULT 参数中有一指针指向无法存取内存空间...sockaddr结构体指针 __len sockaddr结构体字节长度 返回值 : 成功则返回0,失败则返回非0,错误码GetLastError() EBADF 参数sockfd 非合法socket

40510

Linux mmap 作用是什么?

失败,mmap()返回MAP_FAILED[其值为(void *)-1], errno 被设为以下某个值: EACCES:访问出错 EAGAIN:文件已被锁定,或者太多内存已被锁定 EBADFfd...不执行预读,只为已存在于内存中页面建立页表入口。 fd有效文件描述词。如果MAP_ANONYMOUS被设定,为了兼容问题,其值应为 -1。 offset:被映射对象内容偏移。...失败,munmap返回-1,errno 返回标志和 mmap 一致。 该调用在进程地址空间中解除一个映射关系,addr是调用mmap()返回地址,len是映射区大小。...这样造成读文件需要先将文件页磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被用户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到用户空间内存。...而之后访问数据发现内存中并无数据而发起缺页异常过程,可以通过已经建立好映射关系,只使用一次数据拷贝,就从磁盘中将数据传入内存用户空间中,供进程使用

29930

RLIMIT_NOFILE设置陷阱:容器应用高频异常元凶

尤其是打开文件描述符限制(可以通过ulimit -n、RLIMIT_NOFILE或SC_OPEN_MAX查看)被设置得非常高,这种遍历方式将导致数百万次不必要系统调用,显著增加了处理时间。...注意,兼容性考虑,软限制仍保持在1024,传统UNIX select()调用无法处理大于或等于1024文件描述符(FD_SET宏不管是否越界以及越界后果,fd_set也并非严格限制在1024,FD_SET...超过1024值,会造成越界),因此如果全局提升了软限制,那么在使用select()可能出现异常(在现代编程中,程序不应该再使用select(),而应该选择poll()/epoll,但遗憾是这个调用仍然大规模存在...以前文件描述符限制普遍较低。Linux内核首次调用用户空间,RLIMIT_NOFILE默认值设置为软限制1024和硬限制4096。...以这种方式创建 512k 个文件大约会占用 1.1 GiB 内存(至少有一个文件描述符打开使用 sysctl vm.drop_caches=3 也不会释放),每个进程打开等量文件描述符还会额外使用

9210

深入Linux CC++ Timer定时器实现核心原理

需要开启一个定时任务时候,会有一个优雅、如下形式接口: typedef void (*callback)(void*); void setTimeout(unsigned int second,...可以根据实际需要,选择合适定时器容器。 要不要用Timerfd? 开篇表格里有提到,Linux2.6.25开始,timerfd系列API,带来了一种全新定时机制。...每个超时事件独享一个timerfd 如果对于每一个超时事件都用timerfd_create()创建一个对应fd,放到epoll中统一管理。这样做法是不合适。...每增加一个定时事件,都需要额外3个系统调用: ? 此外,文件描述符还是稀缺资源,每个进程能够使用文件描述符是受系统限制,如果定时器过多,会造成严重浪费。...额外系统调用额外3个,降到了1个。而且还有改进空间,只有当栈顶timeout变化时,才调用timerfd_settime()改变。

9.8K83

linux网络编程系列(八)--优雅关闭以及如何检测对端已经关闭

还有一种情况,是说保持连接某一端想关闭连接了,但它需要确保要发送数据全部发送完毕以后才调用close,此种情况下也需要使用优雅关闭; 下面我们就来看看怎么优雅关闭一个socket。 2....); SHUT_RDWR(2) 调用shutdown那一端不允许在s上进行发送和接收数据; 返回值: 0 成功 -1 失败 返回-1errno值如下: EBADF 表示s不是一个有效描述符; ENOTCONN...; ling.l_linger = 0; setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&ling, sizeof(ling)); close(fd...,即等于内核默认情况,close调用会立即返回,可能会也可能不会传输未发送数据; lonoff为非0,llinger为0,则close关闭tcp将丢弃保留在发送缓冲区中任何数据并发送一个RST给对方...如何检测对端已经关闭 一是使用read返回值,如果返回0,并且errno=EAGAIN,则说明连接被对方关闭 使用心跳包,长时间没有接到心跳包,说明连接断开 使用getsockopt判断连接状态,若是

2.8K50

select,poll,epoll区别

select本质是采用32个整数32位,即32*32= 1024来标识,fd值为1-1024。fd值超过1024限制,就必须修改FD_SETSIZE大小。...callback回调机制,迅速激活这个文件描述符,进程调用epoll_wait()便得到通知。...select()返回,timeout参数状态在不同系统中是未定义,因此每次调用select()之前必须重新初始化timeout和文件描述符set。...如果提供了timeout,返回值可能是0;错误时返回-1,并且设置errno为下面几个值之一: EBADF 给某个set提供了无效文件描述符。 EINTR 等待捕获到信号,可以重新发起调用。...返回值和错误代码 成功,poll()返回结构体中revents域不为0文件描述符个数;如果在超时前没有任何事件发生,poll()返回0;失败,poll()返回-1,并设置errno为下列值之一:

1.3K21

【项目设计】仿 muduo 库实现 OneThreadOneEventLoop 式并发服务器

CLOCK_MONOTONIC - 系统开机到现在时间,是⼀种相对时间 flags: 0 - 默认阻塞 返回值:timerfd操作和普通文件操作是一样,因此timerfd_create返回一个文件描述符...int timerfd_settime(int fd, int flags, struct itimerspec *new, struct itimerspec *old); fd: timerfd_create...eventfd 通常与 epoll 搭配使用 – 通过 epoll 进行描述符事件监控,描述符有事件就绪就读取 eventfd 中值,然后进行事件处理。...// 主EventLoop(主Reactor主线程),线程数量为0连接所有操作都在主线程中执行 std::vector _threads; // 保存所有的...LoopThread std::vector _loops; // 保存所有的EventLoop,线程数量大于0_threads中为EventLoop分配线程

47812

Postgresqllatch实现中self-pipe trick解决什么问题

self-pipe trick 1 问题在哪里 当你在使用io multiplexor函数,例如select,有没有考虑过如果收到信号会发生什么?...收到信号后,系统会跳转到信号处理函数,如果当前正在做一些IO相关系统调用,例如上面的select,会直接失败返回EINTR。...结果: 1、虽然PG使用sigaction可以定义syscall行为:SA_RESTART,但这点其实是无法严格保证。...) 2、信号处理喊出要求比较严格:递归调用场景要求函数是可重入,或者在信号处理屏蔽新信号 3、io多路复用函数和信号处理函数竞争场景会有并发问题。...3、信号到来时,信号处理函数在self-pipe[1]中写入1个字节就退出。

34010

腾讯自研Java协程Kona Fiber进阶之路

图1.1展示了线程模型常见做法,图中左侧queue是一个任务队列,线程任务队列里取任务执行,遇到IO操作线程让出cpu。...也就是说,如果使用线程模型,线程个数过多且切换频繁,CPU会大量浪费在线程切换上,导致真正执行业务CPU占比不高。 在协程出现以前,业务高并发+IO密集型业务需求是如何满足呢?...3、提供更好切换效率 Loom采用stack copy方案实现协程切换,协程A切换到协程B,需要将协程A执行栈线程拷贝到Java Heap,将协程BJava Heap中拷贝到当前线程执行栈上...synchronized锁失败,协程会block在jvm中,此时仍相当于协程退化成线程。...协程由于申请synchronized锁失败而block在jvm中,会在ForkJoinPool线程不足时调用compensate动态调整ForkJoinPool线程个数。

2.1K10

Linux内存管理之mmap详解

使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件读写等操作,不必再调用read,write等系统调用.但需注意,直接对该段内存写不会写入超过当前文件大小内容....errno被设为以下某个值 EACCES:访问出错 EAGAIN:文件已被锁定,或者太多内存已被锁定 EBADFfd不是有效文件描述词 EINVAL:一个或者多个参数无效 ENFILE:已达到系统对打开文件限制...系统调用mmap()用于共享内存两种方式 (1)使用普通文件提供内存映射:适用于任何进程之间;此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下: fd=open(name, flag...*vma, unsigned long address, int *type); 返回值: 成功则返回一个有效映射页,失败返回NULL....因此,要寻址某个数据,很容易根据给定文件及数据在文件内偏移量而找到相应页面。

2.6K40

Linux|IO|File IO源码剖析

fd为文件描述符 count为最大写入字节数,最大为MAX_RW_COUNT buffer为用户态缓冲区 需要注意是,我们在使用C++往往会使用flush,用于刷新缓冲区。...- 当前文件中取出fd表,在fd索引处获取文件并且RCU地赋值为null,然后归还fd资源。...pos,在读写自动内核文件状态中获取 whence表示参考基 SEEK_SET 以文件头部为基点 SEEK_CUR 以当前偏移量为基点 SEEK_END 以文件尾部为基点 显然,对于没有头部文件...---- 总结 系统调用都通过VFS层来进行文件,而实际操作通过背后设备驱动完成。 fd本质是进程fdt->fd索引,元素为内核中file结构体,存储打开文件状态。...由内核在file中隐式维护偏移量,并在读写自动更新。 read/write操作不一定直接调用read/write,可能是iter;write操作也无法保证实时更新到磁盘上。

3.6K30
领券