匿名管道實現程序資訊交換

2021-06-21 11:35:53 字數 3320 閱讀 4949

通過建立兩個匿名管道來實現主程序與cmd.exe程序的通訊,在主程序輸入命令後將命令傳送到cmd.exe程序進行執行,執行完成後返回執行結果到主程序並顯示

//程式作用:通過建立的匿名管道與建立的cmd程式通訊,並將cmd中的結果返回

//此處是將本程式和乙個已經存在的可執行程式連線起來進行通訊

#include #include //#include #define max_loop 4

#define sleep_time 100

//建立乙個通過管道與主程序程程通訊的程序,引數一和二為管道的讀端和寫端,引數三為返回的新建的程序程的資訊結構體

bool creatshell(handle *mainread, handle *mainwrite, process_information *pi)

if (!createpipe(&rp2, &wp2, &sa, 1024))

*mainread = rp1; //返回的管道

*mainwrite = wp2;

memset(&si, 0 ,sizeof(si));

si.dwflags = startf_useshowwindow| startf_usestdhandles;

si.wshowwindow = sw_hide;

si.hstdinput = rp2;

si.hstdoutput = wp1;

si.hstderror = wp1;

//第乙個引數是 路徑和可執行檔案;第二個引數是 命令列引數

if(!createprocessa(null,"cmd.exe",null, null, true,create_default_error_mode,null,null,&si, pi))

closehandle(rp2);

closehandle(wp1);

}void printmsg(handle hread )

int i;

unsigned long int nk = 0;

for (i = 0; i< max_loop; i++)

; int nreadsize =1023;

if (!peeknamedpipe(hread, null , 0, null, &nk, null)) //阻塞命名管道

if(nk == 0)

break;

if(!readfile(hread, szread, nreadsize, &nk, null)) //從hread中讀出到szread中

szread[nk] = '\0';

printf("%s", szread);

} sleep(sleep_time);

} return ;

}int main()

char szcomm[1024] = ;

//printmsg(hread);

while (1)

unsigned long int realwrite = 0;

int orderlen = strlen(szcomm);

szcomm[orderlen] = '\n';

bool writable = false;

writable = writefile(hwrite,szcomm, orderlen+1 , &realwrite , null); //寫入命令道新的程序中

//printf("is writable is : %d\n", writable);

//printf("time up\n");

printmsg(hread);

}}

// ctrlshell.cpp : 定義控制台應用程式的入口點。

//#include #include #include #include #define read_num 1023

#define loop_num_get_output 2

#define loop_ms_get_output 100

bool createshell(handle * readhnd, handle * writehnd, process_information * pi)

*readhnd = rh1;

if (!createpipe(&rh2, &wh2, &sa, 1024))

*writehnd = wh2;

memset(&si, 0, sizeof(si));

si.dwflags = startf_useshowwindow | startf_usestdhandles;

si.wshowwindow = sw_hide;

si.hstdinput = rh2;

si.hstdoutput = wh1;

si.hstderror = wh1;

if (!createprocessa(null, "cmd.exe", null, null, true, create_default_error_mode

, null, null, &si, pi))

closehandle(rh2);

closehandle(wh1);

}bool printmsg(handle readh)

if (n2 == 0)

break;

if (!readfile(readh, output, read_num, &n2, null))

output[n2] = null;

printf("%s", output);

} sleep(loop_ms_get_output);//休眠一下等待剩餘的資料

}

return true;

}bool getmsg(handle readh, int num)

if (n2 == 0)

if (!readfile(readh, output, num, &n2, null))

output[n2] = null;

num -= n2;

} return true;

}void main()

unsigned long n;

printmsg(readh);

while (true)

int cmdlen = strlen(cmd);

cmd[cmdlen] = '\n';

writefile(writeh, cmd, cmdlen + 1, &n, null);

getmsg(readh, cmdlen + 1);

if (!printmsg(readh))

}}

程序間通訊 匿名管道

最近實現乙個遠端超級終端的功能,通訊模式是這樣的 客戶端 通過網路傳送cmd命令到 伺服器端 通過程序間通訊 管道 將此cmd命令發給 cmd.exe程式,cmd.exe執行此cmd命令 接下來 cmd.exe 程式將執行結果返回 伺服器端 傳送此次結果到 客戶端,客戶端對結果進行顯示 其中伺服器端...

程序間通訊 匿名管道

1.程序通訊的目的 1 資料傳輸 乙個程序需要將它的資料傳輸給另乙個程序 2 資源共享 多個程序之間共享同樣的資源 3 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了什麼事情 2.管道 管道是一種程序之間通訊的一種方式,我們把從乙個程序連線到另乙個程序的資料流叫做管道 3.匿名管道...

程序間通訊 匿名管道

使用匿名管道做程序通訊,需要用父程序建立乙個子程序,該子程序的標準輸入輸出控制代碼由父程序指定。無論父程序還是子程序,都可以收發資料,這裡僅演示父程序發資料,子程序列印資料。父程序迴圈從控制台讀資料,並傳送給子程序,子程序用對話方塊列印資料,約定子程序收到 quit 後退出。define crt s...