測試**:
例子:從鍵盤讀取資料,寫入管道,讀取管道,寫到螢幕
#include
#include
#include
#include
intmain
(void
)memset
(buf,
0x00
,sizeof
(buf));
// read from pipeif(
(len=
read
(fds[0]
, buf,
100))==
-1)// write to stdoutif(
write(1
, buf, len)
!= len )
}}
站在檔案描述符的角度:
站在核心角度:
共享管道實用的注意事項:
管道使用完後一定要及時關閉檔案描述符,防止資源洩漏
建立子程序時,子程序會程序父程序的檔案描述符表,此時子程序也就能訪問同乙個管道如果父子程序同時讀取管道的內容,只有其中乙個能夠成功讀取到管道中的資料,一旦有乙個程序成功讀取到管道中的內容,那麼該資料就不在管道中了,相當於把資料從管道**隊了。
管道內建了「同步互斥機制」,不會出現兩個程序一人讀取管道一般資料的情況。其中有如下幾種情況:
a.多個程序同時去讀寫管道,管道資料不會錯亂(內建同步互斥)
b.如果管道為空,再去嘗試讀取管道資料,此時程式就會在read處阻塞。
c.如果管道已滿,再去嘗試往管道中寫資料,此時程式就會在write處阻塞;
#include
#include
#include
#include
#include
#include
#include
char g_command[
1024];
static
char
* pipe_command=
;//該函式的功能是獲取命令列輸入的資料
intgetcommand()
//printf("g_command:%s\n",g_command);
return0;
}//解析字串
char**
dealcommand
(char
* command)
//用來儲存命令
static
char
* ar**[
1024]=
;int argc=0;
while
(*command)
*command=
'\0';}
command++;}
ar**[argc]
=null
;//for(int i=0;i//
//printf("\n");
return ar**;
}//進行重定向
intredirect
(char
* g_command)
//去掉多餘的空格
while
(isspace
(*ptr)
)//file就是空格後面的第乙個字串
file = ptr;
//繼續找空格,在這兩個空格之間就是檔案的名稱
while(!
isspace
(*ptr)
&&*ptr !=
'\0'
)*ptr=
'\0'
;//如果redirect_type==0說明是清空重定向,如果==1說明是追加重新定向
if(redirect_type ==0)
else
dup2
(fd,1)
;}ptr++;}
return0;
}//解析字串,獲取管道的數量
intdo_command
(char
* g_command)
ptr++;}
pipe_command[pipe_num +1]
=null
;return pipe_num;
}//進行程式替換
intexec()
else
if(pid==0)
//進行替換,execvp第乙個引數是可執行程式名,第二個引數是該可執行程式的引數組成的陣列
execvp
(ar**[0]
,ar**)
;//execl("/usr/bin/ls","ls","-a",null);
}else
return0;
}//新增管道功能
intdo_pipe
(int pipe_num)};
char
** ar** =
;for
(i =
0;i <= pipe_num;i++
)for
(i =
0;i <= pipe_num; i++
)else
if(pid ==0)
if(i != pipe_num)
execvp
(ar**[0]
,ar**);}
else
}return0;
}int
main()
//處理解析資料
//char** ar** = dealcommand(g_command);
//進行替換
//exec(ar**);
//exec();
int num =
do_command
(g_command)
;do_pipe
(num);}
return0;
}
程序間通訊(一)
為什麼程序間要通訊?1 資料傳輸 2 資源共享 3 通知事件 4 程序控制 程序間通訊方式 管道通訊 共享記憶體 訊息佇列 訊號通訊 一 管道通訊 管道是單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序 寫程序 在管道尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料...
程序間通訊(一)
半雙工管道 fifo 全雙工管道 命名全雙工管道 訊息佇列 訊號量 共享記憶體 套接字 多機其它為單機 管道 包括無名管道 命名管道 訊息佇列 訊號量共享儲存 scoket streams 等。其中,scoket和stream支援不同主機上的兩個程序ipc。一 管道 管道,通常指無名管道,是unix...
程序間通訊(一)
1.程序是一種單執行流,每個程序都私有 獨佔乙份系統資源,段共享但是資料段不共享,子程序寫資料時會觸發寫實拷貝,從而保證資源獨享。總的來說 每個程序各自有不同的使用者位址空間,任何乙個程序的全域性變數在另乙個程序中都看不到 所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使...