当前位置: 首页 > news >正文

选择网站建设公司好淘宝客做网站

选择网站建设公司好,淘宝客做网站,上海做衣服版的网站,开发购物网站描述文章目录1 标准管道流2 无名管道#xff08;PIPE#xff09;3 命名管道#xff08;FIFO#xff09;3.1 创建删除管道文件3.2 打开和关闭FIFO文件3.3 管道案例#xff1a;基于管道的客服端服务器程序使用环境#xff1a;Ubuntu18.04 使用工具#xff1a;VMWare workstati… 文章目录1 标准管道流2 无名管道PIPE3 命名管道FIFO3.1 创建删除管道文件3.2 打开和关闭FIFO文件3.3 管道案例基于管道的客服端服务器程序使用环境Ubuntu18.04 使用工具VMWare workstations xshell作者在学习Linux的过程中对常用的命令进行记录通过思维导图的方式梳理知识点并且通过xshell连接vmware中ubuntu虚拟机进行操作并将练习的截图注解每句话对应相应的命令读者可以无障碍跟练。第六次练习的重点在于Linux的管道这次是进程间的管道通信不同于练习四中介绍的管道文件。1 标准管道流 和文件操作的io流一样管道也支持文件流模式。通过打开和关闭管道流的函数是popen和pclose。 #include stdio.h FILE* popen(const char* command, const char* open_ mode); int pclose(FILE* fp);函数popen允许一个程序将另一个程序作为新的进程启动并可以传递数据给它或者通过它接收数据。command字符串就是要运行的程序名。open_mode必须是“r”或者“w”如果是“r“被调用程序的输出就可以被调用程序使用调用程序使用返回的FILE* 文件流指针就可以通过调用stdio函数库中的fread来读取被调用程序的输出。如果是“w”则可以调用fwrite向被调用程序发送数据而被调用程序可以在自己的标准输入上读取这些数据。函数pclose关闭相关联的文件流。 //读取当前目录下file的内容 #includestdio.h int main() {FILE* fp open(./file,r);char buf[128] {0};while(fgets(buf,sizeof(buf),fp)){puts(buf);}pclose(fp);return 0; }//写一串字符串到标准管道流统计buf单词数量被调用程序必须阻塞等待标准输入 #includestdio.h int main() {char buf[128] {apple orign banana man fale};FILE* fp popen(wc -w,w);//wc -w功能是统计字符串中单词的个数fwrite(buf,sizeof(buf),1,fp);//向被调用的wc -w命令所启动的程序发送buf内容pclose(fp);return 0; }2 无名管道PIPE 管道通信是linux进程通信的一种方式例如可以使用ps -elf|grep ntp查询和ntp相关的管道 无名管道的特点 只能在亲缘关系进程间通信父子进程或者兄弟进程半双工通信管道是特殊文件可以使用read、write只能存在内存中 #includeunistd.h int pipe(int fds[2]);管道在程序中使用一对文件描述符表示其中一个文件描述符有可读属性一个有可写属性。fds[0]是可读fds[1]是可写。函数pipe用于创建一个无名管道如果成功fds[0]中存放文件描述符fds[1]存放可写文件描述符并且函数返回0否则返回-1。通过调用pipe获取这对打开的文件描述符后一个进程就可以从fds[0]中读数据而另一个进程就可以向fds[1]中写数据。两进程必须有几成关系才能继承这对打开的文件描述符。管道文件不是真正的物理文件存活在内存中不持久。当两进程都终止后管道就自动消失。 //创建父子进程创建无名管道父进程写数据子进程读数据 #includestdio.h #includestring.h #includeunistd.h #includestdlib.h #include sys/types.h #include sys/wait.hint main() { int fds[2]; //设置读和写两个文件描述符pipe(fds); //使用pipe函数创建进程并且将两个文件描述符传入参数printf(fds[0] %d,fds[1] %d\n,fds[0],fds[1]);char buf[32] {\0};if(fork() 0){ //表示子进程close(fds[1]); //子进程关闭写操作sleep(2); //确保父进程有时间关闭读操作并且向管道中写内容if(read(fds[0],buf,sizeof(buf))){ //将管道中的内容读到buf缓冲区中puts(buf);close(fds[0]); //关闭子进程的读端exit(0); //结束子进程}}else{ //表示父进程close(fds[0]); //父进程关闭读write(fds[1],hello,6); //从fds[1]向管道中写入hellowaitpid(-1,NULL,0); //等待子进程关闭//wait(NULL); //和waitpid同等效果//write(fds[1],world,6); //此时会出现断开的管道因为子进程的读已经关闭了close(fds[1]); //父进程关闭写exit(0);}return 0; }管道两端的关闭是有先后顺序的如果先关闭写端从另一端读取数据时read函数会返回0表示管道已经关闭。但是如果先关闭读端从另一端写入数据时则会将写数据的进程接收到 SIGPIPE 信号如果写的进程不对此信号处理导致写进程终止。如果写进程处理了此信号则写数据的write函数返回一个负值表示管道已经关闭。看如下代码 #include signal.h #include stdio.h #include string.h #include unistd.hint main() {int fds[2];pipe(fds);//注释掉这部分将导致写进程被信号SIGPIPE终止目的是屏蔽SIGPIPE信号使进程不被终止sigset_t setSig; //设置信号集sigemptyset(setSig); //将信号集清空初始化信号集sigaddset(setSig,SIGPIPE); //将SIGPIPE信号添加到信号集sigprocmask(SIG_BLOCK,setSig,NULL); //将setSig信号集中的信号加入信号掩码中作为新的信号屏蔽字char szBuf[10] {0};if(fork() 0){ //子进程close(fds[1]); //子进程关闭写sleep(2); //确保父关闭读的时间并且写入管道中if(read(fds[0], szBuf, sizeof(szBuf))) //读取管道中的内容puts(szBuf);close(fds[0]); //子进程关闭读}else{close(fds[0]);//父进程关闭读write(fds[1], hello, 6); //父进程通过fds[1]向管道中写入hellowait(NULL); //等待子进程结束write(fds[1], world, 6); //子进程已经关闭了父进程读不到东西了close(fds[1]); //父进程关闭读}return 0; }3 命名管道FIFO 上一节讲了无名管道只能在亲缘关系的进程中通信很大程度上限制了管道的使用。命名管道可以突破这个限制通过指定管道文件的路径实现不相关进程之间的通信。实际上使用管道通信的操作在Linux 练习四 目录操作函数 文件操作函数中就有提及还实现了进程通信的功能。 3.1 创建删除管道文件 创建FIFO文件的方式和创建普通文件的方式一样其函数名和 Linux下创建FIFO的命令名一样。 删除FIFO文件和 Linux下命令也一样。 #include sys/types.h #include sys/stat.h int mkfifo(const char *pathname, mode_t mode); //创建管道文件 int unlink(const char *pathname; //删除管道文件参数 pathname 为要创建的 FIFO 文件的全路径名 参数 mode为文件的访问权限 如果创建成功则返回 0否则-1。 #include sys/types.h #include sys/stat.h #include unistd.h #include stdio.h int main(int argc,char *argv[])//演示通过命令行传递参数 {if(argc ! 2){ //检查参数数量puts(Usage: MkFifo.exe {filename});return -1;}if(mkfifo(argv[1], 0666) -1){ //创建一个管道文件perror(mkfifo fail);return -2;}//删除管道文件unlink(argv[1]);return 0; } 还可以使用命令创建和删除FIFO文件使用两个终端完成必须一边读一边写否则会卡住。 使用命令mkfifo创建管道文件不能重复创建同一个管道文件可以使用unlink删除管道文件通过cat命令和echo命令和输入输出指向和来读写管道文件的案例注意不要使用vim打开管道文件。 3.2 打开和关闭FIFO文件 对 FIFO 类型的文件的打开/关闭跟普通文件一样都是使用 open 和 close 函数。如果打开时使用O_WRONLY 选项则打开 FIFO 的写入端如果使用 O_RDONLY 选项则打开FIFO 的读取端写入端和读取端都可以被几个进程同时打开。在Linux 练习四 目录操作函数 文件操作函数中2.10 管道中有提及。如果以读取方式打开 FIFO并且还没有其它进程以写入方式打开 FIFOopen 函数将被阻塞同样如果以写入方式打开 FIFO并且还没其它进程以读取方式 FIFOopen 函数也将被阻塞。与 PIPE 相同关闭 FIFO 时如果先关读取端将导致继续往 FIFO 中写数据的进程接收 SIGPIPE 的信号 3.3 管道案例基于管道的客服端服务器程序 服务器端 维护服务器管道接受来自客户端发来的字符串将小写字母转换为大写字母然后通过每个客户端维护的管道发给客户端。 //客户端代码 #includestdio.h #includestdlib.h #includesys/types.h #includesys/stat.h #includestring.h #includeunistd.h #includefcntl.h #includectype.h //定义客户端数据结构体 typedef struct tagmag {int client_pid;char my_data[512]; }MSG;int main() {int server_fifo_fd,client_fifo_fd; //定义客户端管道描述符和用户端管道描述符char client_fifo[256]; //设置客户端缓冲区MSG my_msg; char* pstr;memset(my_msg,0,sizeof(MSG)); //清空my_msgmkfifo(SERVER_FIFO,0777); //新建一个管道文件权限是0777server_fifo_fd open(./SERVER_FIFO,O_RDONLY); //以只读的方式打开管道文件if(server_fifo_fd -1){ //打开失败的处理perror(server_fifo_fd);exit(-1);}int iret;//读取管道文件不为空的情况,将管道内容读到结构体的my_data中while((iret read(server_fifo_fd,my_msg.my_data,sizeof(MSG))0)){ pstr my_msg.my_data; printf(%s\n,my_msg.my_data); //打印客户端数据while(*pstr!\0){ //将所有字符转为大写字符*pstr toupper(*pstr);pstr; }memset(client_fifo,0,256); //清空管道文件sprintf(client_fifo,CLIENT_FIFO_%d,my_msg.client_pid);//客户端pid格式化写入client_fifo中client_fifo_fd open(client_fifo,O_WRONLY);//客户端以只写的方式打开client_fifo命名的文件客户管道if(client_fifo_fd -1){perror(client_fifo_fd);exit(-1);}write(client_fifo_fd,my_msg,sizeof(MSG)); //将结构体写入管道内容printf(%s\n,my_msg.my_data);printf(OVER!\n);close(client_fifo_fd);}return 0; }客户端 想服务器端发送数据然后从自己的客户端管道中接受服务器返回的数据。 #includestdio.h #includestdlib.h #includestring.h #includesys/types.h #includesys/stat.h #includeunistd.h #includefcntl.h //定义客户端数据结构体 typedef struct tagmag {int client_pid;char my_data[512]; }MSG;int main() {int server_fifo_fd,client_fifo_fd;char client_fifo[256] {0};sprintf(client_fifo,CLIENT_FIFO_%d,getpid());//将客户端id写入client_fifo字符串中MSG my_msg;memset(my_msg,0,sizeof(MSG)); //清空结构体my_msg.client_pid getpid(); //获取客户端的进程idserver_fifo_fd open(./SERVER_FIFO_NAME,O_WRONLY); //以只写的方式打开服务端管道文件,并获取文件描述符mkfifo(client_fifo,0777); //以client_fifo的内容创建属于该进程的管道文件while(1){int n read(STDIN_FILENO,my_msg.my_data,512);//从标准输入读入字符串到my_datamy_msg.my_data[n] \0;write(server_fifo_fd,my_msg,sizeof(MSG));//将结构体内容写入服务器管道文件中client_fifo_fd open(client_fifo,O_RDONLY);//以只读的方式打开客户端管道文件并且获取文件描述符n read(client_fifo_fd,my_msg,sizeof(MSG));//将结构体读入客户端管道文件中my_msg.my_data[n] 0; write(STDOUT_FILENO,my_msg.my_data,strlen(my_msg.my_data));//将my_data内容写入标准输入输出中close(client_fifo_fd);//关闭客户端}unlink(client_fifo);//删除客户端管道文件return 0; }
http://www.hkea.cn/news/14426404/

相关文章:

  • 做阿里巴巴网站图片尺寸推广一款app的营销方案
  • 做网站的软件wordpress发邮件插件
  • 百度云盘做网站空间wordpress仿谷歌主题
  • 做黄金的分析师网站wordpress ueditor插件
  • 网站建设技术 教材给公司做网站 图片倾权
  • 做贸易把产品放到哪个网站好呢wordpress调用 自定义php
  • php企业网站 源码最有效的线下推广方式
  • 河南中原建设网站微信群全网商城系统
  • 工信部网站备案查询ui设计师网站
  • 做网站去什么公司烟台住房和规划建设局网站
  • 深圳网站制作公司兴田德润官网多少wordpress 页码
  • 国泰君安建设工程官方网站亚马逊seo什么意思
  • 室内环保网站模板代码外贸网站seo怎么做
  • 平台建网站模具外贸营销网站如何做
  • 竞价网站和优化网站的区别大连建站平台
  • 学历网站怎么做怎么分享网站
  • 有区域名和主机怎么做网站湖北外贸网站建设费用
  • 怎么做网站的外部连接SEO做得最好的网站
  • 网站建设公司好背景视频素材下载免费
  • 天猫网站怎么做盛盾科技网站建设
  • 金华做网站建设公司品牌商标注册查询官网
  • 大量网站开发视频 文档VIP资源珠海网站制作费用
  • 上海奉贤 网站建设西安市建设工程交易信息网
  • ui作品集 网站怎么做三亚旅游网
  • 建站的平台天津seo网络优化师
  • 广东工程建设监理协会网站期货交易平台
  • 做百度推广去些网站加客户宿迁人才网
  • 淄博建设网站湖南建设厅官方网站
  • 重庆渝中区企业网站建设联系电话官网怎么进入
  • 网站建设保密协议网站怎么做成手机版