幾個Linux函數的使用

Linux函數可以用man + 函數名查看幫助,有時候英文的看的累,就網上搜了幾個,歸集一下使用方法

1.getrlimit和setrlimit函數

功能描述:
獲取或設定資源使用限制。每種資源都有相關的軟硬限制,軟限制是內核強加給相應資源的限制值,硬限制是軟限制的最大值。非授權調用進程只可以將其軟限制指定爲0~硬限制範圍中的某個值,同時能不可逆轉地降低其硬限制。授權進程可以任意改變其軟硬限制。RLIM_INFINITY的值表示不對資源限制。


用法:
include <sys/time.h>
#include <sys/resource.h>

int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);


參數:
resource:可能的選擇有

RLIMIT_AS //進程的最大虛內存空間,字節爲單位。
RLIMIT_CORE //內核轉存文件的最大長度。
RLIMIT_CPU //最大允許的CPU使用時間,秒爲單位。當進程達到軟限制,內核將給其發送SIGXCPU信號,這一信號的默認行爲是終止進程的執行。然而,可以捕捉信號,處理句柄可將控制返回給主程序。如果進程繼續耗費CPU時間,核心會以每秒一次的頻率給其發送SIGXCPU信號,直到達到硬限制,那時將給進程發送 SIGKILL信號終止其執行。
RLIMIT_DATA //進程數據段的最大值。
RLIMIT_FSIZE //進程可建立的文件的最大長度。如果進程試圖超出這一限制時,核心會給其發送SIGXFSZ信號,默認情況下將終止進程的執行。
RLIMIT_LOCKS //進程可建立的鎖和租賃的最大值。
RLIMIT_MEMLOCK //進程可鎖定在內存中的最大數據量,字節爲單位。
RLIMIT_MSGQUEUE //進程可爲POSIX消息隊列分配的最大字節數。
RLIMIT_NICE //進程可通過setpriority() 或 nice()調用設置的最大完美值。
RLIMIT_NOFILE //指定比進程可打開的最大文件描述詞大一的值,超出此值,將會產生EMFILE錯誤。
RLIMIT_NPROC //用戶可擁有的最大進程數。
RLIMIT_RTPRIO //進程可通過sched_setscheduler 和 sched_setparam設置的最大實時優先級。
RLIMIT_SIGPENDING //用戶可擁有的最大掛起信號數。
RLIMIT_STACK //最大的進程堆棧,以字節爲單位。

rlim:描述資源軟硬限制的結構體,原型如下

struct rlimit {
    rlim_t rlim_cur; /* Soft limit */
    rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
};

返回說明:
成功執行時,返回0。失敗返回-1,errno被設爲以下的某個值
EFAULT:rlim指針指向的空間不可訪問
EINVAL:參數無效
EPERM:增加資源限制值時,權能不允許


2.getrlimit和setrlimit函數

getopt_long()解析命令行選項參數 (2014-01-03 10:51:37)
#include
函數說明:
函數getopt用來解析命令行參數。
函數getopt_long支持長選項的命令行解析。


函數原型:
int getopt_long(int argc, char* const argv[], 
                         const char *optstring,
                         const struct option *longopts, 
                         int *longindex);
參數:
argc、argv直接從main函數中獲取。
opting是選項參數組成的字符串,由下列元素組成:
1.單個字符,表示選項,
2.單個字符後接一個冒號:表示該選項後必須跟一個參數。參數緊跟在選項後或者以空格隔開。該參數的指針賦給optarg。
3.單個字符後跟兩個冒號,表示該選項後可以有參數也可以沒有參數。如果有參數,參數必須緊跟在選項後不能以空格隔開。該參數的指針賦給optarg。(這個特性是GNU的擴張)。
optstring是一個字符串,表示可以接受的參數。例如,"a:b:cd",表示可以接受的參數是a,b,c,d,其中,a和b參數後面跟有更多的參數值。(例如:-a host -b name)
longopts是一個結構的實例:
struct option
{
   const char *name; //name表示的是長參數名
   int has_arg; // has_arg有3個值,no_argument(或者是0),表示該參數後面不跟參數值
                 // required_argument(或者是1),表示該參數後面一定要跟個參數值
                 // optional_argument(或者是2),表示該參數後面可以跟,也可以不跟參數值
   int *flag;    // 用來決定getopt_long()的返回值是什麼。
                 // flag是null,則函數會返回與該項option匹配的val值。
   int val;      // 和flag聯合決定返回值
 };
int *flag  如果這個指針爲NULL,那麼getopt_long()返回該結構val字段中的數值。如果該指針不NULL,getopt_long()會使得它所指向的變量中填入val字段中的數值,並且getopt_long()返回0。如果flag不是NULL,但未發現長選項,那麼它所指向的變量的數值不變。
int val 這個值是發現了長選項時的返回值,或者flag不是 NULL時載入*flag中的值。典型情況下,若flag不是NULL,那麼val是個真/假值,譬如1 或0;另一方面,如果flag是NULL,那麼val通常是字符常量,若長選項與短選項一致,那麼該字符常量應該與optstring中出現的這個選項的參數相同。
=========================================================================
給個例子:
struct option long_options[] = {
            {"a123", required_argument, 0, 'a'},
            {"c123", no_argument, 0, 'c'},
};
現在,如果命令行的參數是-a 123,那麼調用getopt_long()將返回字符'a',並且將字符串123由optarg返回(注意注意!字符串123由optarg帶回!optarg不需要定義,在getopt.h中已經有定義)。
那麼,如果命令行參數是-c,那麼調用getopt_long()將返回字符'c',而此時,optarg是null。
最後,當getopt_long()將命令行所有參數全部解析完成後,返回-1。
===========================================================================
以上來自網絡,便於學習記憶摘錄在這裏,下面是自己的理解:
函數原型:int getopt_long(int argc, char* const argv[], 
                         const char *optstring,
                         const struct option *longopts, 
                         int *longindex);
其中optstring爲單個字符參數,稱爲short_opts。
而longopts爲多個字符(即一個或多個單詞連接)參數,稱爲long_opts。
參數longindex爲longopts數組中的索引返回值。
具體用法參考suricata中main()函數中解析命令行參數:
// 短字符參數
char short_opts[] = "c:TDhi:l:q:d:r:us:S:U:VF:";


// 長字符參數
 struct option long_opts[] = {
        {"dump-config", 0, &dump_config, 1},    // getopt_long返回值爲0,dump_config保存爲1
        {"pfring", optional_argument, 0, 0},    // getopt_long返回值爲0
        {"pfring-int", required_argument, 0, 0},  // getopt_long返回值爲0,必須有參數
        {"pfring-cluster-id", required_argument, 0, 0},
        {"pfring-cluster-type", required_argument, 0, 0},
        {"af-packet", optional_argument, 0, 0},
        {"pcap", optional_argument, 0, 0},
        {"pcap-buffer-size", required_argument, 0, 0},
        {"unittest-filter", required_argument, 0, 'U'},// getopt_long返回值爲‘U’,必須有參數
        {"list-app-layer-protos", 0, &list_app_layer_protocols, 1},
        {"list-unittests", 0, &list_unittests, 1},
        {"list-cuda-cards", 0, &list_cuda_cards, 1},
        {"list-runmodes", 0, &list_runmodes, 1},
        {"list-keywords", optional_argument, &list_keywords, 1},
        {"runmode", required_argument, NULL, 0},
        {"engine-analysis", 0, &engine_analysis, 1},
        {"pidfile", required_argument, 0, 0},
        {"init-errors-fatal", 0, 0, 0},
        {"fatal-unittests", 0, 0, 0},
        {"user", required_argument, 0, 0},
        {"group", required_argument, 0, 0},
        {"erf-in", required_argument, 0, 0},
        {"dag", required_argument, 0, 0},
        {"napatech", 0, 0, 0},
        {"build-info", 0, &build_info, 1},
        {NULL, 0, NULL, 0}
    };
   // 長字符數組索引
    int option_index = 0;
 
 // 以下是用法 
 while ((opt = getopt_long(argc, argv, short_opts, long_opts, &option_index)) != -1) 
 {
        switch (opt) 
        {       // case爲函數返回值
         case 0:
            if (strcmp((long_opts[option_index]).name , "pfring") == 0 ||                                         strcmp((long_opts[option_index]).name , "pfring-int") == 0) 
            {
               // TO-DO...
             }
             else if (strcmp((long_opts[option_index]).name , "pcap") == 0) 
             {
               // TO-DO...
             }
             break;
          case 'c':
             break; 
          case 'T':
             break;
          default:
             usage(argv[0]); 
             exit(EXIT_FAILURE);
        }
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章