linux进程间通信:popen函数通过管道与shell通信
生活随笔
收集整理的這篇文章主要介紹了
linux进程间通信:popen函数通过管道与shell通信
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
函數描述
FILE *popen(const char* command,const char* type)
該函數的執行過程如下:
a. 調用pipe創建一個管道,并fork創建一個子進程來執行shell,shell會創建一個子進程來執行commad
b. 將父進程的輸入輸出重定向到管道,建立一個單向的數據流
c. 返回一個文件指針fp給父進程,父進程可根據fp對管道進行讀寫
d. 模式一:向管道中讀數據,讀命令的標準輸出 fp = popen(command,"r"; ,子進程的標準輸出寫入到管道,被調用popen的父進程讀取,父進程通過對popen返回的文件指針fp進行讀管道,獲取命令執行的結果。
d. 模式二:向管道中寫數據,寫入該命令的標準輸入fp = popen(command,"w");,主要操作是調用popen的父進程向管道寫入內容,寫入的內容通過管道傳給子進程,作為子進程的輸入。
返回值:
如果調用fork()或pipe()失敗,或者不能分配內存將返回NULL,否則返回標準I/O流
代碼實現
#include <stdlib.h>
#include <stdio.h>#define BUF_SIZE 1024 void popen_read()
{FILE * p_file = NULL;char buf[BUF_SIZE] = {0};p_file = popen("lsmod|grep crc", "r");if (!p_file) {fprintf(stderr, "Erro to popen");}//fgets(buf,sizeof(buf),p_file);fread(buf,1,1024,p_file);printf("%s", buf);pclose(p_file);
}void popen_write()
{FILE * p_file = NULL;char buf[BUF_SIZE] = {0};p_file = popen("cat > write.log","w");if (p_file == NULL) {exit (-1);}fwrite("crc",1,sizeof("crc"),p_file);pclose(p_file);
}
int main(void)
{popen_read();popen_write();return 0;
}
輸出如下:
[root@node1 ~]# ./a.out
libcrc32c 12644 2 xfs,iscsi_scst
crc32_pclmul 13113 0
crc_t10dif 12714 1 sd_mod
crct10dif_pclmul 14289 1
crct10dif_common 12595 2 crct10dif_pclmul,crc_t10dif
crc32c_intel 22079 1
[root@node1 ~]# cat write.log
crc
總結
以上是生活随笔為你收集整理的linux进程间通信:popen函数通过管道与shell通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux进程间通信:shell管道 |
- 下一篇: linux进程通信:pipe实现进程同步