本文關鍵字: linux 管道通信,linux 進程通信方式 ,標準流管道
1.標準流管道函數說明
與Linux的文件操作中有基于文件流的標準I/O操作一樣,管道的操作也支持基于文件流的模式。這種基于文件流的管道主要是用來創建一個連接到另一個進程的管道,這里的“另一個進程”也就是一個可以進行一定操作的可執行文件,例如,用戶執行“ls -l”或者自己編寫的程序“./pipe”等。由于這類操作很常用,因此標準流管道就將一系列的創建過程合并到一個函數popen()中完成。它所完成的工作有以下幾步:
● 創建一個管道。
● fork()一個子進程。
● 在父子進程中關閉不需要的文件描述符。
● 執行exec函數族調用。
● 執行函數中所指定的命令。
這個函數的使用可以大大減少代碼的編寫量,但同時也有一些不利之處。例如,它不如前面管道創建的函數那樣靈活多樣,并且用popen()創建的管道必須使用標準I/O函數進行操作,但不能使用前面的read()、write()一類不帶緩沖的I/O函數。
與之相對應,關閉用popen()創建的流管道必須使用函數pclose()。該函數關閉標準I/O流,并等待命令執行結束。
2.函數格式
popen()和pclose()函數語法要點如表1和表2所示。
表1 popen()函數語法要點
所需頭文件 |
#include <stdio.h> |
函數原型 |
FILE *popen(const char *command, const char *type) |
函數傳入值 |
command:指向的是一個以null結束符結尾的字符串,這個字符串包含一個shell命令,并被送到/bin/sh以-c參數執行,即由shell來執行 |
type |
“r”:文件指針連接到command的標準輸出,即該命令的結果產生輸出
“w”:文件指針連接到command的標準輸入,即該命令的結果產生輸入
|
函數返回值 |
成功:文件流指針 |
出錯:-1 |
表2 pclose()函數語法要點
所需頭文件 |
#include <stdio.h> |
函數原型 |
int pclose(FILE *stream) |
函數傳入值 |
stream:要關閉的文件流 |
函數返回值 |
成功:返回由popen()所執行的進程的退出碼 |
出錯:-1 |
3.使用實例
在該實例中,使用popen()來執行“ps -ef”命令。可以看出,popen()函數的使用能夠使程序變得短小精悍。
/* standard_pipe.c */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#define BUFSIZE 1024
int main()
{
FILE *fp;
char *cmd = "ps -ef";
char buf[BUFSIZE];
if ((fp = popen(cmd, "r")) == NULL) /* 調用popen()函數執行相應的命令 */
{
printf("Popen error\n");
exit(1);
}
while ((fgets(buf, BUFSIZE, fp)) != NULL)
{
printf("%s",buf);
}
pclose(fp);
exit(0);
}
下面是該程序在目標板上的執行結果。
$ ./standard_pipe
PID TTY Uid Size State Command
1 root 1832 S init
2 root 0 S [keventd]
…
74 root 1284 S ./standard_pipe
75 root 1836 S sh -c ps -ef
76 root 2020 R ps –ef
本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》
熱點鏈接:
1、無名管道系統調用
2、Linux下進程間通信方式-管道
3、Linux下進程間通信
4、實驗:編寫守護進程
5、實驗:編寫多進程程序
更多新聞>> |