用無名管道重定向子程序的輸入輸出

2021-07-28 02:02:04 字數 2246 閱讀 8021

pipeserver:

// 開啟管道伺服器

int startpipeserver(int size,char style,tchar *path)

if(!createpipe(&item.hstdoutread,&item.hstdoutwrite,&saattr,0))

if(!duplicatehandle(getcurrentprocess(),item.hstdoutwrite,getcurrentprocess(),&item.hstderrwrite,0,true,duplicate_same_access))

item.inum = giclientnum++;

item.usbpath = path;

addpipenode(glistpipe,item);

dword id;

handle hthread = createthread(null,0,readfromclientpipethread,(lpvoid)item.inum,0,&id);

if(hthread == null)

loadstringa(null,ids_create_thread_readpipe,strmsg,64);

printf("%s, thread id=%d\n",strmsg,id);

wsprintf(lpszcmdline,l"%s %d %c %s",lpszcomcmdline,size,style,path);

//wprintf(_t("cmdline:%s\n"),lpszcmdline);

zeromemory(&si,sizeof(si));

si.cb = sizeof(startupinfo);

si.dwflags |= startf_usestdhandles;

si.dwflags |= startf_useshowwindow;

si.hstdoutput = item.hstdoutwrite; // 子程序的stdout輸出到hstdoutwrite

si.hstderror = item.hstderrwrite; // 子程序的stderr輸出到hstderrwrite

si.hstdinput = item.hstdinread;

hstdinread = item.hstdinwrite;

if(!createprocess(null,lpszcmdline,null,null,true,0,null,null,&si,&pi))

return 0;

}

// 寫入stdin

bool writetopipe(char *inbuff,handle hpipe)

}// 讀出stdout

bool readfrompipe(char *outbuff,handle hpipe)

else }

// 從管道讀取資料執行緒

dword callback readfromclientpipethread(lpvoid lpvparam)

char strmsg[64];

char strbuf[256]="";

int num = (int)lpvparam;

handle hpipe = getreadouthandlebynum(glistpipe,num);

if(hpipe == null)

char recvbuf[256]="";

dword dwlen = 0;

int isend = 0;

while(readfile(hpipe,recvbuf,256,&dwlen,null))

if(mysubstrfind(recvbuf,"done") >= 0)

break;

} else

memset(recvbuf,'\0',sizeof(recvbuf));

} loadstringa(null,ids_recvfrom_pipe_thread_quit,strmsg,64);

printf("%s\n",strmsg);

return 0;

}

pipeclient:

1.只要讀取stdin,和寫入stdout。字串後面加上'\n'。

2.如果管道伺服器還是不能及時收到資料,用fflush(stdout);

3.管道中有資料時子程序不能退出,否則伺服器收不到資料。

4.客戶端退出時可以略微延時

管道重定向與程序間通訊

先來看看下面的這張圖 當進行i o重定向時,只是將不同程序表的不同fd指向同一檔案表結構。關於i o重定向,要用到以下的重要函式 int dup int oldfd int dup2 int oldfd,int targetfd 利用函式dup,我們可以複製乙個描述符。傳給該函式乙個既有的描述符,它...

重定向dup 管道 程序間通訊

先來看看下面的這張圖 當進行i o重定向時,只是將不同程序表的不同fd指向同一檔案表結構。關於i o重定向,要用到以下的重要函式 int dup int oldfd int dup2 int oldfd,int targetfd 利用函式dup,我們可以複製乙個描述符。傳給該函式乙個既有的描述符,它...

管道重定向的應用

簡述linux系統內,程序的優先順序概念。1 嘗試啟動乙個優先順序較高的sleep程序。2 使用renice修改該程式的優先順序。答 linux 系統中,每個cpu在乙個時間點上只能處理乙個程序,通過時間片技術,來同時執行多個程式。系統根據程序的優先順序進行cpu資源的分配。優先順序範圍是 20至1...