管道調(diào)用子程序
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供武平網(wǎng)站建設(shè)、武平做網(wǎng)站、武平網(wǎng)站設(shè)計、武平網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、武平企業(yè)網(wǎng)站模板建站服務(wù),十載武平做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
我們想在程序中使用一個子程序,但是需要動態(tài)的傳遞參數(shù)(這里說的動態(tài),是指根據(jù)上次子程序輸入的結(jié)果來決定這次輸入什么),怎么辦呢,不用慌,有subprocess!
下文我先介紹一個例子代碼,以及他的輸出結(jié)果!
1.#!/usr/bin/python2.from subprocess import *3.# Subprocess management,可以做很多子進(jìn)程的文件,我們要引入這個文件4.p = Popen(["cat", "-n"], bufsize=1024,stdin=PIPE, 5.stdout=PIPE, close_fds=True)6.# 打開程序第一個參數(shù)是一個列表(程序名稱,參數(shù))7.# 第二個參數(shù)是緩沖區(qū)大小8.# stdin,stdout是設(shè)置是否打開這些管道,如果他的值是subprocess.PIPE的話,9.# 就會打開,同stdin一樣的還有stderr10.# close_fds設(shè)置為true(unix-only)所有的文件描述符除了(0,1,2)在子程序執(zhí)行前都會關(guān)閉11.(fin, fout) = (p.stdin, p.stdout)12.for i in range(10): # 你會懂的^_^ 13.fin.write("line" + str(i)) 14.fin.write('\n') 15.fin.flush() 16.print fout.readline()
他的輸出結(jié)果是:1.line02.line13.line24.line35.line46.line57.line68.line79.line810.line9
mkfifo函數(shù)使用
[code]mkfifo(建立實名管道)
相關(guān)函數(shù)
pipe,popen,open,umask
表頭文件
#include
#include
定義函數(shù)
int mkfifo(const char * pathname,mode_t mode);
函數(shù)說明
mkfifo() 會依參數(shù)pathname建立特殊的FIFO文件,該文件必須不存在,而參數(shù)mode為該文件的權(quán)限(mode%~umask),因此 umask值也會影響到FIFO文件的權(quán)限。Mkfifo()建立的FIFO文件其他進(jìn)程都可以用讀寫一般文件的方式存取。當(dāng)使用open()來打開 FIFO文件時,O_NONBLOCK旗標(biāo)會有影響
1、當(dāng)使用O_NONBLOCK 旗標(biāo)時,打開FIFO 文件來讀取的操作會立刻返回,但是若還沒有其他進(jìn)程打開FIFO 文件來讀取,則寫入的操作會返回ENXIO 錯誤代碼。
2、沒有使用O_NONBLOCK 旗標(biāo)時,打開FIFO 來讀取的操作會等到其他進(jìn)程打開FIFO文件來寫入才正常返回。同樣地,打開FIFO文件來寫入的操作會等到其他進(jìn)程打開FIFO 文件來讀取后才正常返回。
返回值
若成功則返回0,否則返回-1,錯誤原因存于errno中。
錯誤代碼
EACCESS 參數(shù)pathname所指定的目錄路徑無可執(zhí)行的權(quán)限
EEXIST 參數(shù)pathname所指定的文件已存在。
ENAMETOOLONG 參數(shù)pathname的路徑名稱太長。
ENOENT 參數(shù)pathname包含的目錄不存在
ENOSPC 文件系統(tǒng)的剩余空間不足
ENOTDIR 參數(shù)pathname路徑中的目錄存在但卻非真正的目錄。
EROFS 參數(shù)pathname指定的文件存在于只讀文件系統(tǒng)內(nèi)。
示例1:
#include
#include
#include
#include
int main(void)
{
char buf[80];
int fd;
unlink( "zieckey_fifo" );
mkfifo( "zieckey_fifo", 0777 );
if ( fork() 0 )
{
char s[] = "Hello!\n";
fd = open( "zieckey_fifo", O_WRONLY );
write( fd, s, sizeof(s) );
//close( fd );
}
else
{
fd = open( "zieckey_fifo", O_RDONLY );
read( fd, buf, sizeof(buf) );
printf("The message from the pipe is:%s\n", buf );
//close( fd );
}
return 0;
}
執(zhí)行
hello!
示例2:
#include
#include
#include
#include
#include
int main( int argc, char **argv )
{
mode_t mode = 0666;
if ( argc !=2 )
{
printf( "Usage:[%s] fifo_filename\n", argv[0] );
return -1;
}
if (mkfifo( argv[1], mode)0 )
{
perror( "mkfifo");
return -1;
}
return 0;
} [/code]
管道有兩端,讀端和寫端。創(chuàng)建管道,然后從父進(jìn)程fork出子進(jìn)程,
父進(jìn)程和子進(jìn)程擁有共同的讀寫文件描述符,可以實現(xiàn)子進(jìn)程寫文件,父進(jìn)程讀文件的操作。
本文標(biāo)題:關(guān)于python管道函數(shù)實現(xiàn)的信息
本文地址:http://chinadenli.net/article42/dodejhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、ChatGPT、微信公眾號、Google、響應(yīng)式網(wǎng)站、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)