Linux C編程--popen函數詳解

Linux C popen()函數詳解

表頭文件

#include<stdio.h>

定義函數

FILE * popen( const char * command,const char * type);

函數說明

popen()會調用fork()產生子進程,然後從子進程中調用/bin/sh -c來執行參數command的指令。參數type可使用“r”代表讀取,“w”代表寫入。依照此type值,popen()會建立管道連到子進程的標準輸出設備或標準輸入設備,然後返回一個文件指針。隨後進程便可利用此文件指針來讀取子進程的輸出設備或是寫入到子進程的標準輸入設備中。此外,所有使用文件指針(FILE*)操作的函數也都可以使用,除了fclose()以外。

  • 如果 type 爲 r,那麼調用進程讀進 command 的標準輸出。
  • 如果 type 爲 w,那麼調用進程寫到 command 的標準輸入。

返回值

若成功則返回文件指針,否則返回NULL,錯誤原因存於errno中。

錯誤代碼

EINVAL參數type不合法。

注意事項

在編寫具SUID/SGID權限的程序時請儘量避免使用popen(),popen()會繼承環境變量,通過環境變量可能會造成系統安全的問題。

範例

1

2

3

4

5

6

7

8

9

10

11

#include<stdio.h>

 

main()

{

    FILE *fp;

    char buffer[80];

    fp = popen("cat /etc/passwd""r");

    fgets(buffer, sizeof(buffer), fp);

    printf("%s", buffer);

    pclose(fp);

}

執行

root :x:0 0: root: /root: /bin/bash

測試:

linux環境

void
get_Ip (char **localIp)
{
  FILE *fpIp;
  *localIp = (char *) malloc (N * sizeof (char));
  memset (*localIp, 0, N * sizeof (char));
  system ("ifconfig | grep 'inet addr:'| grep -v '127.0.0.1'| cut -d: -f 2 | awk '{print $1}' > /dev/shm/get_ip.txt");
  fpIp = popen ("grep -Ff /dev/shm/get_ip.txt /etc/hosts.d/tcfs.hosts | awk '{print $1}'", "r");
  fread (*localIp, N * sizeof (char), sizeof (*localIp), fpIp);
  pclose (fpIp);
  free (*localIp);
}

轉載:https://www.cnblogs.com/52php/p/5722238.html

參考:

Linux C編程--popen函數詳解 

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