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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UNIX环境高级编程》笔记--getrlimit和setrlimit函数

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UNIX环境高级编程》笔记--getrlimit和setrlimit函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

每個進程都有一組資源限制,其中一些可以使用getrlimit和setrlimit函數進行查詢和修改。

[cpp] view plain copy
  • #include?<sys/resource.h>??
  • int?getrlimit(int?resource,?struct?rlimit?*rptr);??
  • int?setrlimit(int?resource,?const?struct?rlimit?*rptr);??
  • 兩個函數返回值:如成功返回0,出錯則返回非0值。


    進程的資源是在系統初始化時由進程0建立的,然后由每個后續進程繼承,每種實現都可以用自己的方法對各種限制做出調整。

    對這兩個函數的每一次調用都會制定一個資源以及一個指向下列結構的指針。

    [cpp] view plain copy
  • struct?rlimit{??
  • ????rlim_t?rlim_cur;???//soft?limit:?current?limit??
  • ????rlim_t?rlim_max;??//hard?limit:?maximum?value?for?rlim_cur??
  • }??
  • 在更改資源限制時,必須遵循下列三條規則:

    1.任何進程都可將一個軟限制值更改為小于或者等于其硬限制值。

    2.任何一個進程都可以降低其硬限制值,但它必須大于等于其軟限制值。這種降低對普通用戶來說是不可逆的。

    3.只有超級用戶進程可以提高硬限制值。


    這兩個函數的resource參數取下列值之一:


    RLIMIT_AS:進程可用存儲區的最大總長度(字節)。

    RLIMIT_CORE:core文件的最大字節數,若取值為0則阻止創建core文件。

    RLIMIT_CPU:CPU時間的最大值(秒),當超過此軟限制時,向該進程發送SIGXCPU信號。

    RLIMIT_DATA:數據段的最大字節長度。

    RLIMIT_FSIZE:可以創建的文件的最大字節長度。當超過此軟限制時,則向該進程發送SIGXFSZ信號。

    RLIMIT_LOCKS:一個進程可持有的文件鎖的最大數。

    RLIMIT_MEMLOCK:一個進程使用mlock能夠鎖定在存儲器中的最大字節長度。

    RLIMIT_NOFILE:每個進程能打開最大文件數。更改此限制將影響到sysconf函數在參數_SC_OPEN_MAX返回的值。

    RLIMIT_NPROC:每個實際用戶ID可擁有的最大子進程數。更改此限制將影響到sysconf函數在參數_SC_CHILD_MAX返回的值。

    RLIMIT_RSS:最大駐內存集的字節長度。(resident set size in bytes,RSS)

    RLIMIT_SBSIZE:用戶在任一給定時刻可以占用的套接字緩沖區的最大長度。

    RLIMIT_STACK:棧的最大字節長度。

    RLIMIT_VMEM:這是RLIMT_AS的同義詞。

    資源限制影響到調用進程并由其子進程繼承,這就意味著為了影響一個用戶的所有后續進程,需將資源限制的設置構造在shell之

    中,確實,bsh,bash,ksh具有內置的ulimit命令,csh具有內置的limit命令。(umask和chdir也是shell內置的)


    實踐:

    [cpp] view plain copy
  • #include?<stdio.h>??
  • #include?<sys/resource.h>??
  • ??
  • void?pr_limits(char*?name,?int?resource){??
  • ????????struct?rlimit?limit;??
  • ????????if(getrlimit(resource,?&limit)?<0){??
  • ????????????????perror("getrlimit");??
  • ????????}??
  • ??
  • ????????printf("%-15s",name);??
  • ????????if(limit.rlim_cur?==?RLIM_INFINITY){??
  • ????????????????printf("(infinite)?????");??
  • ????????}else{??
  • ????????????????printf("%-15ld",limit.rlim_cur);??
  • ????????}??
  • ??
  • ????????if(limit.rlim_max?==?RLIM_INFINITY){??
  • ????????????????printf("(infinite)?????");??
  • ????????}else{??
  • ????????????????printf("%-15ld",limit.rlim_max);??
  • ????????}??
  • ????????printf("\n");??
  • }??
  • ??
  • int?main(void){??
  • ????????pr_limits("LIMIT_AS",RLIMIT_AS);??
  • ????????pr_limits("RLIMIT_CORE",RLIMIT_CORE);??
  • ????????pr_limits("RLIMIT_CPU",RLIMIT_CPU);??
  • ????????pr_limits("RLIMIT_DATA",RLIMIT_DATA);??
  • ????????pr_limits("RLIMIT_FSIZE",RLIMIT_FSIZE);??
  • ????????pr_limits("RLIMIT_LOCKS",RLIMIT_LOCKS);??
  • ????????pr_limits("RLIMIT_MEMLOCK",RLIMIT_MEMLOCK);??
  • ????????pr_limits("RLIMIT_NOFILE",RLIMIT_NOFILE);??
  • ????????pr_limits("RLIMIT_NPROC",RLIMIT_NPROC);??
  • ????????pr_limits("RLIMIT_RSS",RLIMIT_RSS);??
  • ????????pr_limits("RLIMIT_STACK",RLIMIT_STACK);??
  • ????????return?0;??
  • }??
  • 運行結果:

    LIMIT_AS ? ? ? (infinite) ? ? (infinite)
    RLIMIT_CORE ? ?0 ? ? ? ? ? ? ?(infinite)
    RLIMIT_CPU ? ? (infinite) ? ? (infinite)
    RLIMIT_DATA ? ?(infinite) ? ? (infinite)
    RLIMIT_FSIZE ? (infinite) ? ? (infinite)
    RLIMIT_LOCKS ? (infinite) ? ? (infinite)
    RLIMIT_MEMLOCK 65536 ? ? ? ? ?65536
    RLIMIT_NOFILE ?1024 ? ? ? ? ? 4096
    RLIMIT_NPROC ? 5875 ? ? ? ? ? 5875
    RLIMIT_RSS ? ? (infinite) ? ? (infinite)
    RLIMIT_STACK ? 8388608 ? ? ? ?(infinite)

    總結

    以上是生活随笔為你收集整理的UNIX环境高级编程》笔记--getrlimit和setrlimit函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。