自助建网站工具,凡科 360免费建站,iss服务器上部署的网站怎么打开,adsl做网站一、Xmind整理#xff1a;
管道的原理#xff1a; 有名管道的特点#xff1a; 信号的原理#xff1a; 二、课上练习#xff1a;
练习1#xff1a;pipe
功能#xff1a;创建一个无名管道#xff0c;同时打开无名管道的读写端
原型#xff1a;
#include unist…一、Xmind整理
管道的原理 有名管道的特点 信号的原理 二、课上练习
练习1pipe
功能创建一个无名管道同时打开无名管道的读写端
原型
#include unistd.h
int pipe(int pipefd[2]); int* pfd; int pfd[]
参数
int pipefd[2]函数运行完毕后该参数指向的数组中会存储两个文件描述符;
pipefd[0]: 读端文件描述符
pipefd[1]: 写端文件描述符;
返回值
成功返回0;
失败返回-1更新errno;
小练
#include stdio.h
#include string.h
#include stdlib.h
#include head.h
int main(int argc, const char *argv[])
{//管道的创建必须放在fork函数前//若放在fork函数后会导致父子进程各自创建一根管道//此时会导致父子进程各自操作各自的管道无法进行通信int pfd[2] {0};if(pipe(pfd) 0){perror(pfd);return -1;}printf(pipe success pfd[0]%d pfd[1]%d\n,pfd[0],pfd[1]);pid_t cpid fork();if(cpid 0) //父进程中为真{//父进程发送数据给子进程char buf[128];while(1){fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] 0; //从终端获取数据最后会拿到\n字符将\n字符修改成0//将数据写入到管道文件中if(write(pfd[1],buf,sizeof(buf)) 0){perror(write);return -1;}printf(写入成功\n);}}else if(0 cpid) //子进程中为真{//子进程读取父进程发送过来的数据char buf[128] ;ssize_t res 0;while(1){bzero(buf,sizeof(buf));printf(__%d__\n,__LINE__);//当管道中没有数据的时候read函数阻塞res read(pfd[0],buf,sizeof(buf));printf(res%ld : %s\n,res,buf); }}else{perror(fork);return -1;}return 0;
}练习2mkfifo
功能创建一根有名管道
原型
#include sys/types.h
#include sys/stat.h
int mkfifo(const char *pathname, mode_t mode);
参数
char *pathname指定要创建的有名管道的路径以及名字;
mode_t mode有名管道的权限:0664 0777真实的权限 (mode ~umask)
the permissions of the created file are (mode ~umask)
返回值
成功返回0;
失败返回-1更新errno;
errno 17,文件已经存在的错误这是一个允许存在的错误忽略该错误
练习3操作有名管道
功能操作有名管道与用文件IO操作普通文件一致
原型
#include sys/types.h
#include sys/stat.h
#include fcntl.h
int open(const char *pathname, int flags);
参数 int flags:O_RDONLY 只读O_WRONLY 只写O_RDWR 读写---上述三种必须且只能包含一种---O_NONBLOCK 非阻塞 1.int flags O_RDONLY open函数阻塞此时需要另外一个进程或线程以写的方式打开同一根管道open函数解除阻塞 2.int flags O_WRONLY open函数阻塞此时需要另外一个进程或线程以读的方式打开同一根管道open函数解除阻塞 3.int flags O_RDWR open函数不阻塞此时管道的读写端均被打开 当管道的读写端均被打开的时候此时open函数不阻塞 4.int flags O_RDONLY | O_NONBLOCK open函数不阻塞open函数运行成功此时管道只有读端 5.int flags O_WRONLY | O_NONBLOCK open函数不阻塞open函数运行失败此时管道的读写端均打开失败 示例:
读端
#include stdio.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include errno.h
#include unistd.h
#include string.hint main(int argc, const char *argv[])
{umask(0);if(mkfifo(./fifo, 0777) 0){//printf(errno %d\n, errno);if(errno ! 17) //17 EEXIST{perror(mkfifo);return -1;}}printf(create FIFO success\n);//open函数阻塞int fd open(./fifo, O_RDONLY);if(fd 0){perror(open);return -1;}printf(open FIFO rdonly success fd%d\n, fd);char buf[128] ;ssize_t res 0;while(1){bzero(buf, sizeof(buf));res read(fd, buf, sizeof(buf));if(res 0){perror(read);return -1; }else if(0 res){printf(对端关闭\n);break;}printf(%ld %s\n, res, buf);}close(fd);return 0;
}
写端
#include stdio.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include errno.h
#include unistd.h
#include string.hint main(int argc, const char *argv[])
{umask(0);if(mkfifo(./fifo, 0777) 0){ //printf(errno %d\n, errno);if(errno ! 17) //17 EEXIST{perror(mkfifo);return -1; }} printf(create FIFO success\n);//open函数阻塞int fd open(./fifo, O_WRONLY);if(fd 0){ perror(open);return -1; } printf(open FIFO wronly success fd%d\n, fd);char buf[128] ; while(1){ printf(请输入);fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] 0;if(write(fd, buf, sizeof(buf)) 0){perror(write);return -1; }printf(写入成功\n);} close(fd);return 0;
}
小练
#include stdio.h
#include string.h
#include stdlib.h
#include head.h
int main(int argc, const char *argv[])
{//创建有名管道if(mkfifo(./fifo,0664) 0){//printf(%d\n,errno);if(errno ! 17) //17:文件已经存在错误这是一个允许存在的错误忽略该错误{perror(mkfifo);return -1;}}printf(mkfifo success\n);/*int fd open(./fifo,O_RDWR);if(fd 0){perror(open);return -1;}printf(open success fd %d\n,fd);
*/int fd_r open(./fifo,O_RDONLY|O_NONBLOCK);if(fd_r 0){perror(open);return -1;}printf(open success fd_r %d\n,fd_r);int fd_w open(./fifo,O_WRONLY|O_NONBLOCK);if(fd_w 0){perror(open);return -1;}printf(open success fd_w %d\n,fd_w);return 0;
}练习4常见的信号 练习5signal
功能捕获信号为信号注册新的处理函数
原型
#include signal.h
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler); //void (*handler)(int);
参数
int signum指定要捕获的信号对应的编号。可以填编号也可以填对应的宏。2) SIGINT
sighandler_t handler函数指针回调函数;
1) SIG_IGN忽略信号 9) 19)号信号无法忽略;
2) SIG_DFL执行默认操作;
3) 传入一个函数的首地址代表捕获信号且该函数的返回值必须是void类型参数列表必须是int类型,例如void handler(int sig){ }
typedef void (*sighandler_t)(int); typedef void (*)(int) sighandler_t;
typedef 旧的类型名 新的类型名;
typedef int uint32_t; int a ---- uint32_t a;
typedef int* pint; int* pa --- pint pa;
typedef void (*)(int) sighandler_t; void (*ptr)(int) ---- sighandler_t ptr;
返回值
成功返回该信号的上一个信号处理函数的首地址; 默认处理函数的首地址获取不到返回NULL
失败返回SIG_ERR ((__sighandler_t)-1)更新errno;
小练
#include stdio.h
#include string.h
#include stdlib.h
#include signal.h
#include head.h
void handler(int sig)
{printf(this is sig%d\n,sig);return;
}
int main(int argc, const char *argv[])
{//捕获2号SIGINT信号if(signal(2,handler) SIG_ERR){perror(signal);return -1;}printf(捕获2号信号成功\n);//捕获3号SIGINT信号if(signal(3,handler) SIG_ERR){perror(signal);return -1;}printf(捕获3号信号成功\n);//捕获20号SIGINT信号if(signal(20,handler) SIG_ERR){perror(signal);return -1;}printf(捕获20号信号成功\n);while(1){printf(this is main func\n);sleep(1);}return 0;
} 三、课后作业
1.要求实现AB进程对话 A进程先发送一句话给B进程B进程接收后打印 B进程再回复一句话给A进程A进程接收后打印 重复1.2步骤当收到quit后要结束AB进程 提示两根管道
A进程
#include stdio.h
#include string.h
#include stdlib.h
#include head.h
int main(int argc, const char *argv[])
{//创建有名管道if(mkfifo(./fifo,0664) 0){//printf(%d\n,errno);if(errno ! 17) //17:文件已经存在错误这是一个允许存在的错误忽略该错误{perror(mkfifo);return -1;}}printf(mkfifo success\n);if(mkfifo(./fifo1,0664) 0){//printf(%d\n,errno);if(errno ! 17) //17:文件已经存在错误这是一个允许存在的错误忽略该错误{perror(mkfifo);return -1;}}printf(mkfifo1 success\n);int fd_r open(./fifo,O_RDONLY);if(fd_r 0){perror(open);return -1;}printf(open success fd_r %d\n,fd_r);int fd_w open(./fifo1,O_WRONLY);if(fd_w 0){perror(open);return -1;}printf(open success fd_w %d\n,fd_w);//从管道中读取数据打印到终端上char buf[128];ssize_t res 0;while(1){bzero(buf,sizeof(buf));//当管道的读写端均存在若管道中没有数据则read函数阻塞res read(fd_r,buf,sizeof(buf));if(strcmp(buf,quit) 0){write(fd_w,buf,sizeof(buf));break;}if(res 0){perror(read);return -1;}if(0 res){printf(写端关闭\n);break;}printf(res %ld\n输出:%s\n,res,buf);bzero(buf, sizeof(buf));printf(请输入);fgets(buf, sizeof(buf),stdin);buf[strlen(buf)-1] \0;if(write(fd_w,buf,sizeof(buf)) 0){perror(write);return -1;}printf(写入数据成功 res %ld\n,res);}close(fd_r);close(fd_w);return 0;
}B进程
#include stdio.h
#include string.h
#include stdlib.h
#include head.h
int main(int argc, const char *argv[])
{//创建有名管道if(mkfifo(./fifo,0664) 0){//printf(%d\n,errno);if(errno ! 17) //17:文件已经存在错误这是一个允许存在的错误忽略该错误{perror(mkfifo);return -1;}}printf(mkfifo success\n);if(mkfifo(./fifo1,0664) 0){//printf(%d\n,errno);if(errno ! 17) //17:文件已经存在错误这是一个允许存在的错误忽略该错误{perror(mkfifo);return -1;}}printf(mkfifo1 success\n);int fd_w open(./fifo,O_WRONLY);if(fd_w 0){perror(open);return -1;}printf(open success fd_w %d\n,fd_w);int fd_r open(./fifo1,O_RDONLY); if(fd_r 0){perror(open);return -1;}printf(open success fd_r %d\n,fd_r);//从终端获取数据写到管道中char buf[128];ssize_t res 0;while(1){bzero(buf, sizeof(buf));printf(请输入);fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] \0;if(strcmp(buf,quit) 0){write(fd_w,buf,sizeof(buf));break;}if(write(fd_w,buf,sizeof(buf)) 0){perror(write);return -1;}printf(写入数据成功 res %ld\n,res);bzero(buf,sizeof(buf));//当管道的读写端均存在若管道中没有数据则read函数阻塞res read(fd_r,buf,sizeof(buf));if(res 0){perror(read);return -1;}if(0 res){printf(写端关闭\n);break;}printf(res %ld\n输出:%s\n,res,buf);}close(fd_w);close(fd_r);return 0;
}2.在第1题的基础上实现A能随时发信息给BB能随时接收A发送的数据反之亦然。
A进程
#include stdio.h
#include unistd.h
#include sys/types.h
#include sys/stat.h
#include errno.h
#include fcntl.h
#include string.h
#include sys/wait.h
#include signal.hint main(int argc, const char *argv[])
{if(mkfifo(./fifo, 0775) 0) //当前进程写该管道{if(17 ! errno) //#define EEXIST 17{perror(mkfifo);return -1;}}printf(fifo create success\n);if(mkfifo(./fifo1, 0775) 0) //当前进程读该管道{if(17 ! errno) //#define EEXIST 17{perror(mkfifo);return -1;}}printf(fifo1 create success\n);//创建一个子进程pid_t cpid fork();if(cpid 0){//读 fifo1int fd_r open(./fifo1, O_RDONLY); //阻塞if(fd_r 0){perror(open);return -1;}printf(open fifo rdonly success __%d__\n, __LINE__);ssize_t res 0;char buf[128] ;while(1){bzero(buf, sizeof(buf));//读写段均存在且管道中没有数据该函数阻塞res read(fd_r, buf, sizeof(buf));if(res 0){perror(read);return -1;}else if(0 res){printf(对端进程退出\n);break; }printf(res%ld : buf%s\n, res, buf);if(!strcmp(buf, quit))break;}close(fd_r);kill(cpid, 9);wait(NULL);}else if(0 cpid){//写 fifoint fd_w open(./fifo, O_WRONLY); //阻塞if(fd_w 0){perror(open);return -1;}printf(open fifo wronly success __%d__\n, __LINE__);char buf[128] ;while(1){bzero(buf, sizeof(buf));// printf(请输入);fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] 0;if(write(fd_w, buf, sizeof(buf)) 0){perror(write);return -1;}// printf(写入成功\n);if(!strcmp(buf, quit))break;}close(fd_w);kill(getppid() , 9);}else{perror(fork);return -1;}return 0;
}B进程
#include stdio.h
#include unistd.h
#include sys/types.h
#include sys/stat.h
#include errno.h
#include fcntl.h
#include string.h
#include sys/wait.h
#include signal.hint main(int argc, const char *argv[])
{if(mkfifo(./fifo, 0775) 0) //当前进程写该管道{if(17 ! errno) //#define EEXIST 17{perror(mkfifo);return -1;}}printf(fifo create success\n);if(mkfifo(./fifo1, 0775) 0) //当前进程读该管道{if(17 ! errno) //#define EEXIST 17{perror(mkfifo);return -1;}}printf(fifo1 create success\n);//创建一个子进程pid_t cpid fork();if(cpid 0){//读 fifoint fd_r open(./fifo, O_RDONLY); //阻塞if(fd_r 0){perror(open);return -1;}printf(open fifo rdonly success __%d__\n, __LINE__);ssize_t res 0;char buf[128] ;while(1){bzero(buf, sizeof(buf));//读写段均存在且管道中没有数据该函数阻塞res read(fd_r, buf, sizeof(buf));if(res 0){perror(read);return -1;}else if(0 res){printf(对端进程退出\n);break; }printf(res%ld : buf%s\n, res, buf);if(!strcmp(buf, quit))break;}close(fd_r);kill(cpid, 9);wait(NULL);}else if(0 cpid){//写 fifo1int fd_w open(./fifo1, O_WRONLY); //阻塞if(fd_w 0){perror(open);return -1;}printf(open fifo wronly success __%d__\n, __LINE__);char buf[128] ;while(1){bzero(buf, sizeof(buf));//printf(请输入);fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] 0;if(write(fd_w, buf, sizeof(buf)) 0){perror(write);return -1;}// printf(写入成功\n);if(!strcmp(buf, quit))break;}close(fd_w);kill(getppid() , 9);}else{perror(fork);return -1;}return 0;
} 文章转载自: http://www.morning.pggkr.cn.gov.cn.pggkr.cn http://www.morning.nqxdg.cn.gov.cn.nqxdg.cn http://www.morning.4r5w91.cn.gov.cn.4r5w91.cn http://www.morning.qrcxh.cn.gov.cn.qrcxh.cn http://www.morning.pyzt.cn.gov.cn.pyzt.cn http://www.morning.bhwll.cn.gov.cn.bhwll.cn http://www.morning.lmzpk.cn.gov.cn.lmzpk.cn http://www.morning.tqdlk.cn.gov.cn.tqdlk.cn http://www.morning.wqcbr.cn.gov.cn.wqcbr.cn http://www.morning.bykqg.cn.gov.cn.bykqg.cn http://www.morning.nngq.cn.gov.cn.nngq.cn http://www.morning.bkryb.cn.gov.cn.bkryb.cn http://www.morning.qtsks.cn.gov.cn.qtsks.cn http://www.morning.rzscb.cn.gov.cn.rzscb.cn http://www.morning.fhqdb.cn.gov.cn.fhqdb.cn http://www.morning.jmbfx.cn.gov.cn.jmbfx.cn http://www.morning.qcwck.cn.gov.cn.qcwck.cn http://www.morning.mlntx.cn.gov.cn.mlntx.cn http://www.morning.ydryk.cn.gov.cn.ydryk.cn http://www.morning.wtdyq.cn.gov.cn.wtdyq.cn http://www.morning.fjntg.cn.gov.cn.fjntg.cn http://www.morning.smkxm.cn.gov.cn.smkxm.cn http://www.morning.jzbjx.cn.gov.cn.jzbjx.cn http://www.morning.hngmg.cn.gov.cn.hngmg.cn http://www.morning.wwnb.cn.gov.cn.wwnb.cn http://www.morning.gxtbn.cn.gov.cn.gxtbn.cn http://www.morning.snnkt.cn.gov.cn.snnkt.cn http://www.morning.xqxrm.cn.gov.cn.xqxrm.cn http://www.morning.lbbgf.cn.gov.cn.lbbgf.cn http://www.morning.txnqh.cn.gov.cn.txnqh.cn http://www.morning.yxwcj.cn.gov.cn.yxwcj.cn http://www.morning.zwhtr.cn.gov.cn.zwhtr.cn http://www.morning.tpyjr.cn.gov.cn.tpyjr.cn http://www.morning.dgsr.cn.gov.cn.dgsr.cn http://www.morning.xwzsq.cn.gov.cn.xwzsq.cn http://www.morning.fwcnx.cn.gov.cn.fwcnx.cn http://www.morning.gidmag.com.gov.cn.gidmag.com http://www.morning.wmmjw.cn.gov.cn.wmmjw.cn http://www.morning.gbsfs.com.gov.cn.gbsfs.com http://www.morning.pxspq.cn.gov.cn.pxspq.cn http://www.morning.xxiobql.cn.gov.cn.xxiobql.cn http://www.morning.lwgrf.cn.gov.cn.lwgrf.cn http://www.morning.lgrkr.cn.gov.cn.lgrkr.cn http://www.morning.slmbg.cn.gov.cn.slmbg.cn http://www.morning.mgtmm.cn.gov.cn.mgtmm.cn http://www.morning.zpyh.cn.gov.cn.zpyh.cn http://www.morning.cjqqj.cn.gov.cn.cjqqj.cn http://www.morning.sldrd.cn.gov.cn.sldrd.cn http://www.morning.jspnx.cn.gov.cn.jspnx.cn http://www.morning.dfrenti.com.gov.cn.dfrenti.com http://www.morning.jfxdy.cn.gov.cn.jfxdy.cn http://www.morning.jnbsx.cn.gov.cn.jnbsx.cn http://www.morning.cgntj.cn.gov.cn.cgntj.cn http://www.morning.wqbfd.cn.gov.cn.wqbfd.cn http://www.morning.rnsjp.cn.gov.cn.rnsjp.cn http://www.morning.fmswb.cn.gov.cn.fmswb.cn http://www.morning.jpkk.cn.gov.cn.jpkk.cn http://www.morning.mjkqj.cn.gov.cn.mjkqj.cn http://www.morning.bwmq.cn.gov.cn.bwmq.cn http://www.morning.xqkcs.cn.gov.cn.xqkcs.cn http://www.morning.xxsrm.cn.gov.cn.xxsrm.cn http://www.morning.nnjq.cn.gov.cn.nnjq.cn http://www.morning.knlbg.cn.gov.cn.knlbg.cn http://www.morning.nhzxr.cn.gov.cn.nhzxr.cn http://www.morning.qkwxp.cn.gov.cn.qkwxp.cn http://www.morning.gbwfx.cn.gov.cn.gbwfx.cn http://www.morning.mytmn.cn.gov.cn.mytmn.cn http://www.morning.jtsdk.cn.gov.cn.jtsdk.cn http://www.morning.yxgqr.cn.gov.cn.yxgqr.cn http://www.morning.jrrqs.cn.gov.cn.jrrqs.cn http://www.morning.jgcrr.cn.gov.cn.jgcrr.cn http://www.morning.rxgnn.cn.gov.cn.rxgnn.cn http://www.morning.qmzhy.cn.gov.cn.qmzhy.cn http://www.morning.dqdss.cn.gov.cn.dqdss.cn http://www.morning.zdhnm.cn.gov.cn.zdhnm.cn http://www.morning.rnhh.cn.gov.cn.rnhh.cn http://www.morning.jfbbq.cn.gov.cn.jfbbq.cn http://www.morning.djpps.cn.gov.cn.djpps.cn http://www.morning.drhnj.cn.gov.cn.drhnj.cn http://www.morning.tsdqr.cn.gov.cn.tsdqr.cn