pipe函式使用
pipe(建立管道)
表標頭檔案 #include
定義函式 int pipe(int filedes[2]);
函式說明
pipe()會建立管道,並將檔案描述詞由引數 filedes 陣列返回。
filedes[0]為管道里的讀取端,所以pipe用read呼叫的
filedes[1]則為管道的寫入端。
返回值: 若成功則返回零,否則返回-1,錯誤原因存於 errno 中。
錯誤程式碼:
EMFILE 程式已用完檔案描述詞最大量
ENFILE 系統已無檔案描述詞可用。
EFAULT 引數 filedes 陣列地址不合法。
#include
#include
int main( void )
{
int filedes[2];
char buf[80];
pid_t pid;
pipe( filedes );
if ( (pid=fork()) > 0 )
{
printf( "This is in the father process,here write a string to the pipe.\n" );
char s[] = "Hello world , this is write by pipe.\n";
write( filedes[1], s, sizeof(s) );
close( filedes[0] );
close( filedes[1] );
}
else
{
printf( "This is in the child process,here read a string from the pipe.\n" );
read( filedes[0], buf, sizeof(buf) );
printf( "%s\n", buf );
close( filedes[0] );
close( filedes[1] );
}
waitpid( pid, NULL, 0 );
return 0;
}
[root@localhost src]# gcc pipe.c
[root@localhost src]# ./a.out
This is in the child process,here read a string from the pipe.
This is in the father process,here write a string to the pipe.
Hello world , this is write by pipe.
-----------------------------------------------------------------------------
#include
#include
#include
#include
#include
int main(){
int pipe_fd[2];
pid_t pid;
char buf_r[100];
char *p_wbuf;
int r_num;
memset(buf_r,0,sizeof(buf_r));
//建立管道
if(pipe(pipe_fd)<0){
printf("pipe create error\n");
return -1;
}
if((pid=fork())==0){//表示在子程式中
printf("\n");
//關閉管道寫描述符,進行管道讀操作
close(pipe_fd[1]);
sleep(2);
//管道描述符中讀取
if((r_num=read(pipe_fd[0],buf_r,100))>0){
printf("%d numbers read from the pipe is %s\n",r_num,buf_r);
}
close(pipe_fd[0]);
exit(0);
}
else if(pid>0){//表示在父程式中,父程式寫
//關閉管道讀描述符,進行管道寫操作
close(pipe_fd[0]);
if(write(pipe_fd[1],"Hello",5)!=-1)
printf("parent write1 success!\n");
if(write(pipe_fd[1],"Pipe",5)!=1)
printf("parent write2 success!\n");
close(pipe_fd[1]);
sleep(3);
waitpid(pid,NULL,0);
exit(0);
}
}
管道讀寫注意事項:
1.必須在系統呼叫fork()中呼叫pipe(),否則子程式將不會繼承檔案描述符;
2.當使用半雙工管道時,任何關聯的程式都必須共享一個相關的祖先程式。
----------------------------------------------------------------------------------------
int in[2],out[2],err[2],child_fd[3];
#define close_pipe(pipe) close(pipe[0]); close(pipe[1])
int SendCmd(const char *Cmd)
{
int iRet = 0;
iRet = write(child_fd[0], Cmd, strlen(Cmd));
return iRet;
}
int ReadDate(const char *Buf,int Len)
{
int iRet = 0;
iRet = read(child_fd[1], (void *)Buf, Len);
return iRet;
}
int main(void)
{
//int filedes[2];
char buf[80];
pid_t pid;
pipe(in);
pipe(out);
pipe(err);
pid=fork();
if(pid == 0)
{
printf( "This is in the child process,here read a string from the pipe.\n" );
int err_fd = dup(2);
FILE* errf = fdopen(err_fd,"w");
// Bind the std fd to our pipes
dup2(in[0],0);
dup2(out[1],1);
dup2(err[1],2);
execl("/bin/sh","sh","-c","/usr/bin/mplayer -slave -idle -quiet -v -af",(void*)NULL);
fprintf(errf,"exec failed : %s\n",strerror(errno));
exit(1);
}
else if(pid<0)
{
printf( "This is in the father process\n" );
stderr,"errno : %s\n",strerror(errno);
close_pipe(in);
close_pipe(out);
close_pipe(err);
return 0;
}
child_fd[0] = in[1];
child_fd[1] = out[0];
child_fd[2] = err[0];
printf("Start...\n");
while(1)
{
switch(getchar())
{
case 'r':
SendCmd("loadfile /mnt/Chinese/CH_1.avi\n");
break;
dafault:
break;
}
//SendCmd("loadfile /mnt/Chinese/CH_1.avi\n");
//sleep(5);
}
return 0;
}
相關文章
- PIPE函式的例子函式
- JavaScript中的compose函式和pipe函式JavaScript函式
- Pandas - pandas.Series.pipe 函式函式
- linux程式設計之pipe()函式Linux程式設計函式
- pipe row的用法, Oracle split 函式寫法.Oracle函式
- 管道函式及表函式的測試PIPELINED__PIPE ROW函式
- 如何寫一個能在gulp build pipe中任意更改src內容的函式UI函式
- 函式: 函式是怎麼使用的?函式
- 何時使用函式表示式與函式宣告函式
- edge函式使用函式
- 【Java】函式使用Java函式
- 02_函式定義及使用函式函式
- 使用Pipe來執行RMAN命令
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- round函式與trunc函式的使用方法函式
- 【函式】Oracle中聚合函式rank()使用方法函式Oracle
- Shell 函式的使用函式
- Thunk函式的使用函式
- Generator 函式的使用函式
- Spark Sql 函式使用SparkSQL函式
- LNNVL函式的使用函式
- Grouping函式使用函式
- exe等函式使用函式
- Oracle over()函式使用Oracle函式
- 索引中使用函式索引函式
- sqlserver DATEPART函式使用SQLServer函式
- smarty塊函式使用函式
- 使用bind()函式的產生的函式用作建構函式this的指向函式
- 【轉】使用oracle pipe傳遞訊息Oracle
- OpenCL中的管道cl::Pipe的使用
- 函式指標使用c++類成員函式函式指標C++
- vb如何使用ftp函式,vb如何使用ftp函式要知道這些FTP函式
- 管道pipe
- Broken pipe
- async函式使用場景函式
- 高階函式的使用函式
- tap函式的日常使用函式
- python-函式使用Python函式