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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

linux进程间通信:popen函数通过管道与shell通信

發布時間:2023/11/27 生活经验 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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通信的全部內容,希望文章能夠幫你解決所遇到的問題。

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