通過建立兩個匿名管道來實現主程序與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...