影片來啦
終於!
終於!
終於!
期待已久的
小影片
終於來了!
嘿,你是在期待我們西郵學生的創新創意嗎?
你想透過微電影解說的形式瞭解管道通訊機制嗎?
在討論中,他們先從自己對管道的理解引入,對於出現的新問題也進行分析討論。關於管道通訊程式碼部分,他們也給出了一些想法和攻略,一起來看看靠不靠譜。
此時的我大概露出了
90後老年人般的微笑了吧
附程式碼部分(程式碼內滑動):
//管道
#include
#include
#include
#include
#include
#include
#include
#define MAX_DATA_LEN 256
#define DELAY_TIME 1
int main()
{
pid_t pid;
int pipe_fd[2];
char buf[MAX_DATA_LEN];
const char data[]=”pipe Test Program”;
int real_read,real_write;
memset((void*)buf,0,sizeof(buf));//為新申請的記憶體做初始化工作,buf的內容初始化為零
//建立管道
if(pipe(pipe_fd)<0)//成功,傳回0,否則傳回-1
{
printf(“pipe create error\n”);
exit(1);
}
if((pid=fork())==0)
{
//子行程關閉寫描述符,並透過使子行程暫停3秒等待父行程已關閉相應的讀描述符
close(pipe_fd[1]);//fd[0]:讀管道,fd[1]:寫管道
sleep(DELAY_TIME*3);
//子行程讀取管道內容
if((real_read=read(pipe_fd[0],buf,MAX_DATA_LEN))>0)
//檔案描述符,讀完傳回讀取的字數,失敗傳回-1,buf:指定的緩衝區,指向一段記憶體單元;
{printf(“%d bytes read from the pipe is ‘%s’\n”,real_read,buf);
}
//關閉子行程讀描述
close(pipe_fd[0]);
exit(0);
}
else if (pid>0)
{//父行程關閉讀描述,並透過使父行程暫已關閉相應的寫描述符停1秒等待子行程
close(pipe_fd[0]);
sleep(DELAY_TIME);
if((real_write=write(pipe_fd[1],data,strlen(data)))!=-1)
{
printf(“parent wrote %d byte :’%s’\n”,real_write,data);
}
close(pipe_fd[1]);
waitpid(pid,NULL,0);//pid>0時,只等待行程ID等於pid的子行程,不管其它已經有多少子行程執行結束退出了,只要指定的子行程還沒有結束,waitpid就會一直等下去。
exit(0);
}
return 0;
}
//管道
#include
#include
#include
#include
#include
#include
#include
#define MAX_DATA_LEN 256
#define DELAY_TIME 1
int main()
{
pid_t pid;
int pipe_fd[2];
char buf[MAX_DATA_LEN];
const char data[]=”pipe Test Program”;
int real_read,real_write;
memset((void*)buf,0,sizeof(buf));//為新申請的記憶體做初始化工作,buf的內容初始化為零
//建立管道
if(pipe(pipe_fd)<0)//成功,傳回0,否則傳回-1
{
printf(“pipe create error\n”);
exit(1);
}
if((pid=fork())==0)
{
//子行程關閉寫描述符,並透過使子行程暫停3秒等待父行程已關閉相應的讀描述符
close(pipe_fd[1]);//fd[0]:讀管道,fd[1]:寫管道
sleep(DELAY_TIME*3);
//子行程讀取管道內容
if((real_read=read(pipe_fd[0],buf,MAX_DATA_LEN))>0)
//檔案描述符,讀完傳回讀取的字數,失敗傳回-1,buf:指定的緩衝區,指向一段記憶體單元;
{printf(“%d bytes read from the pipe is ‘%s’\n”,real_read,buf);
}
//關閉子行程讀描述
close(pipe_fd[0]);
exit(0);
}
else if (pid>0)
{//父行程關閉讀描述,並透過使父行程暫已關閉相應的寫描述符停1秒等待子行程
close(pipe_fd[0]);
sleep(DELAY_TIME);
if((real_write=write(pipe_fd[1],data,strlen(data)))!=-1)
{
printf(“parent wrote %d byte :’%s’\n”,real_write,data);
}
close(pipe_fd[1]);
waitpid(pid,NULL,0);//pid>0時,只等待行程ID等於pid的子行程,不管其它已經有多少子行程執行結束退出了,只要指定的子行程還沒有結束,waitpid就會一直等下去。
exit(0);
}
return 0;
}
//管道
#include
#include
#include
#include
#include
#include
#include
#define MAX_DATA_LEN 256
#define DELAY_TIME 1
int main()
{
pid_t pid;
int pipe_fd[2];
char buf[MAX_DATA_LEN];
const char data[]=”pipe Test Program”;
int real_read,real_write;
memset((void*)buf,0,sizeof(buf));//為新申請的記憶體做初始化工作,buf的內容初始化為零
//建立管道
if(pipe(pipe_fd)<0)//成功,傳回0,否則傳回-1
{
printf(“pipe create error\n”);
exit(1);
}
if((pid=fork())==0)
{
//子行程關閉寫描述符,並透過使子行程暫停3秒等待父行程已關閉相應的讀描述符
close(pipe_fd[1]);//fd[0]:讀管道,fd[1]:寫管道
sleep(DELAY_TIME*3);
//子行程讀取管道內容
if((real_read=read(pipe_fd[0],buf,MAX_DATA_LEN))>0)
//檔案描述符,讀完傳回讀取的字數,失敗傳回-1,buf:指定的緩衝區,指向一段記憶體單元;
{printf(“%d bytes read from the pipe is ‘%s’\n”,real_read,buf);
}
//關閉子行程讀描述
close(pipe_fd[0]);
exit(0);
}
else if (pid>0)
{//父行程關閉讀描述,並透過使父行程暫已關閉相應的寫描述符停1秒等待子行程
close(pipe_fd[0]);
sleep(DELAY_TIME);
if((real_write=write(pipe_fd[1],data,strlen(data)))!=-1)
{
printf(“parent wrote %d byte :’%s’\n”,real_write,data);
}
close(pipe_fd[1]);
waitpid(pid,NULL,0);//pid>0時,只等待行程ID等於pid的子行程,不管其它已經有多少子行程執行結束退出了,只要指定的子行程還沒有結束,waitpid就會一直等下去。
exit(0);
}
return 0;
}
執行結果: