10.18.2015

Linux C popen(), pclose(), perror()

這一個案例,Linux下管線 (pipe)的相關函式。至於要如何應用呢?? 假設,我們在程式中有這樣的需求:要取得Shell Script: "cat -n /etc/resolv.conf | wc -l"所回傳的值:

[root@localhost]# cat -n /etc/resolv.conf
  1 # Generated by NetworkManager
  2 nameserver 168.95.192.1
[root@localhost]#

我們要查看/etc/resolv.conf這個檔案的內容;"wc -l"可以計算這個檔案的行數:

[root@localhost]# wc -l /etc/resolv.conf
2 /etc/resolv.conf
[root@localhost]#

[root@localhost]# cat -n /etc/resolv.conf | wc -l
2
[root@localhost]#

我們的目的只要取得"2"這個值,該怎麼做??
// main_r.c
#include <stdio.h>
#include <string.h>

int main(void)
{
    FILE *fp = (FILE *)NULL;
    char szTemp[4];

    memset(&szTemp, '\0', sizeof(char) * 4);
    fp = popen("cat -n /etc/resolv.conf | wc -l", "r");
    if (fp == NULL)
        perror("Create popen() failed!! \n");
    else
        fread((void *)&szTemp, sizeof(char), 4, fp);
    printf("szTemp: %s \n", szTemp);
    pclose(fp);

    return 0;
}
反之,我們要把程式中的某一項結果 (數值或是字串)丟給Shell Script來執行呢??
// main_w.c
#include <stdio.h>
#include <string.h>

int main(void)
{
    FILE *fp = (FILE *)NULL;
    char szTemp[] = "Hello!! World!! \n";

    fp = popen("od -c", "w");
    if (fp == NULL)
        perror("Create popen() failed!! \n");
    else
        fwrite((void *)&szTemp, sizeof(char), strlen(szTemp), fp);
    pclose(fp);

    return 0;
}
[root@localhost]# ./main_w
0000000 H e l l o ! ! W o r l d ! !
0000020 \n
0000021
[root@localhost]#

至於popen(), pclose(), perror()的函式原型就不贅述了,可自行Google;或是man, info指令去查詢。

還有,這些函式是屬於比較高階的管線函式,所以必須搭配fread()fwrite()去執行 (其實用fgets()fputs()也是可以啦)。

沒有留言:

張貼留言