管道調(diào)用子程序
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供武平網(wǎng)站建設(shè)、武平做網(wǎng)站、武平網(wǎng)站設(shè)計(jì)、武平網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、武平企業(yè)網(wǎng)站模板建站服務(wù),十載武平做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
我們想在程序中使用一個(gè)子程序,但是需要?jiǎng)討B(tài)的傳遞參數(shù)(這里說的動(dòng)態(tài),是指根據(jù)上次子程序輸入的結(jié)果來決定這次輸入什么),怎么辦呢,不用慌,有subprocess!
下文我先介紹一個(gè)例子代碼,以及他的輸出結(jié)果!
1.#!/usr/bin/python2.from subprocess import *3.# Subprocess management,可以做很多子進(jìn)程的文件,我們要引入這個(gè)文件4.p = Popen(["cat", "-n"], bufsize=1024,stdin=PIPE, 5.stdout=PIPE, close_fds=True)6.# 打開程序第一個(gè)參數(shù)是一個(gè)列表(程序名稱,參數(shù))7.# 第二個(gè)參數(shù)是緩沖區(qū)大小8.# stdin,stdout是設(shè)置是否打開這些管道,如果他的值是subprocess.PIPE的話,9.# 就會(huì)打開,同stdin一樣的還有stderr10.# close_fds設(shè)置為true(unix-only)所有的文件描述符除了(0,1,2)在子程序執(zhí)行前都會(huì)關(guān)閉11.(fin, fout) = (p.stdin, p.stdout)12.for i in range(10): # 你會(huì)懂的^_^ 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(建立實(shí)名管道)
相關(guān)函數(shù)
pipe,popen,open,umask
表頭文件
#include
#include
定義函數(shù)
int mkfifo(const char * pathname,mode_t mode);
函數(shù)說明
mkfifo() 會(huì)依參數(shù)pathname建立特殊的FIFO文件,該文件必須不存在,而參數(shù)mode為該文件的權(quán)限(mode%~umask),因此 umask值也會(huì)影響到FIFO文件的權(quán)限。Mkfifo()建立的FIFO文件其他進(jìn)程都可以用讀寫一般文件的方式存取。當(dāng)使用open()來打開 FIFO文件時(shí),O_NONBLOCK旗標(biāo)會(huì)有影響
1、當(dāng)使用O_NONBLOCK 旗標(biāo)時(shí),打開FIFO 文件來讀取的操作會(huì)立刻返回,但是若還沒有其他進(jìn)程打開FIFO 文件來讀取,則寫入的操作會(huì)返回ENXIO 錯(cuò)誤代碼。
2、沒有使用O_NONBLOCK 旗標(biāo)時(shí),打開FIFO 來讀取的操作會(huì)等到其他進(jìn)程打開FIFO文件來寫入才正常返回。同樣地,打開FIFO文件來寫入的操作會(huì)等到其他進(jìn)程打開FIFO 文件來讀取后才正常返回。
返回值
若成功則返回0,否則返回-1,錯(cuò)誤原因存于errno中。
錯(cuò)誤代碼
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)程擁有共同的讀寫文件描述符,可以實(shí)現(xiàn)子進(jìn)程寫文件,父進(jìn)程讀文件的操作。