日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux新的API signalfd、timerfd、eventfd使用说明——eventfd

發(fā)布時(shí)間:2023/12/10 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux新的API signalfd、timerfd、eventfd使用说明——eventfd 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

好久沒更新了,今天看一下第三種新的fd:eventfd類似于管道的概念,可以實(shí)現(xiàn)線程間的事件通知,所不同的是eventfd的緩沖區(qū)大小是sizeof(uint64_t)也就是8字節(jié),它是一個(gè)64位的計(jì)數(shù)器,寫入遞增計(jì)數(shù)器,讀取將得到計(jì)數(shù)器的值,并且清零??匆幌麓a:

[cpp] view plaincopy
  • #include?<sys/eventfd.h>??
  • #include?<unistd.h>??
  • #include?<stdlib.h>??
  • #include?<stdio.h>??
  • #include?<stdint.h>?????????????/*?Definition?of?uint64_t?*/??
  • ??
  • #define?handle_error(msg)?\??
  • ???do?{?perror(msg);?exit(EXIT_FAILURE);?}?while?(0)??
  • ??
  • int??
  • main(int?argc,?char?*argv[])??
  • {??
  • ???uint64_t?u;??
  • ??????
  • ???int?efd?=?eventfd(10,?0);??
  • ???if?(efd?==?-1)??
  • ???????handle_error("eventfd");??
  • ?????
  • ???int?ret?=?fork();??
  • ???if(ret?==?0)??
  • ???{??
  • ???????for?(int?j?=?1;?j?<?argc;?j++)?{??
  • ???????????printf("Child?writing?%s?to?efd\n",?argv[j]);??
  • ???????????u?=?atoll(argv[j]);??
  • ???????????ssize_t?s?=?write(efd,?&u,?sizeof(uint64_t));??
  • ???????????if?(s?!=?sizeof(uint64_t))??
  • ???????????????handle_error("write");??
  • ???????}??
  • ???????printf("Child?completed?write?loop\n");??
  • ??
  • ???????exit(EXIT_SUCCESS);??
  • ???}??
  • ???else??
  • ???{??
  • ???????sleep(2);??
  • ??
  • ???????ssize_t?s?=?read(efd,?&u,?sizeof(uint64_t));??
  • ???????if?(s?!=?sizeof(uint64_t))??
  • ???????????handle_error("read");??
  • ???????printf("Parent?read?%llu?from?efd\n",(unsigned?long?long)u);??
  • ???????exit(EXIT_SUCCESS);??
  • ???}??
  • }??
  • 比較簡(jiǎn)單,不做過解釋。子進(jìn)程寫入命令行中傳入的參數(shù),父進(jìn)程讀取其中計(jì)數(shù)器的值。

    運(yùn)行結(jié)果:

    [cpp] view plaincopy
  • ./eventfd?10?20?30??
  • Child?writing?10?to?efd??
  • Child?writing?20?to?efd??
  • Child?writing?30?to?efd??
  • Child?completed?write?loop??
  • Parent?read?70?from?efd??
  • 命令行傳入的是10、20、30其和應(yīng)為60,為啥讀取的是70呢?請(qǐng)看15行調(diào)用eventfd時(shí)第一個(gè)參數(shù)是10,這個(gè)參數(shù)是創(chuàng)建eventfd時(shí)初始化計(jì)數(shù)器的值。

    總結(jié)

    以上是生活随笔為你收集整理的linux新的API signalfd、timerfd、eventfd使用说明——eventfd的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。