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

网站建设客户需求分析调查表湛江专业建站推广机构

网站建设客户需求分析调查表,湛江专业建站推广机构,网站建设服务器需要钱吗,自建电商平台有哪些此为牛客Linux C和黑马Linux系统编程课程笔记。 0. 关于进程通信 Linux环境下#xff0c;进程地址空间相互独立#xff0c;每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到#xff0c;所以进程和进程之间不能相互访问#xff0c;要交换…此为牛客Linux C和黑马Linux系统编程课程笔记。 0. 关于进程通信 Linux环境下进程地址空间相互独立每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到所以进程和进程之间不能相互访问要交换数据必须通过内核在内核中开辟一块缓冲区进程1把数据从用户空间拷到内核缓冲区进程2再从内核缓冲区把数据读走内核提供的这种机制称为进程间通信IPCInterProcess Communication。 在进程间完成数据传递需要借助操作系统提供特殊的方法如文件、管道、信号、共享内存、消息队列、套接字、命名管道等。随着计算机的蓬勃发展一些方法由于自身设计缺陷被淘汰或者弃用。现今常用的进程间通信方式有 ① 管道 (使用最简单) ② 信号 (开销最小) ③ 共享映射区 (无血缘关系) ④ 本地套接字 (最稳定) 1. 匿名管道 管道是一种最基本的IPC机制作用于有血缘关系的进程之间完成数据传递。调用pipe系统函数即可创建一个管道。有如下特点 匿名管道采用了循环队列可将写指针看作队列头读指针看作队列尾 2. pipe函数 Linux中使用pipe函数创建管道 #include unistd.h int pipe(int pipefd[2]);功能 创建一个匿名管道用于进程间通信。 参数 int pipefd[2] 这个数组是一个传出参数。 pipefd[0] 对应的是管道的读端 pipefd[1] 对应的是管道的写端 返回值 成功 0 失败 -1 注意 管道默认是阻塞的如果管道中没有数据read阻塞如果管道满了write阻塞匿名管道只能用于具有关系的进程之间的通信父子进程兄弟进程当调用pipe后当前进程的文件描述符表中就已经有两个文件描述符分别指向管道的读端和写端pipefd[0]和pipefd[1]返回这两个文件描述符。 如下示例程序能够实现子进程发送数据给父进程父进程读取到数据输出到终端。 #include unistd.h #include sys/types.h #include stdio.h #include stdlib.h #include string.hint main() {// 子进程发送数据给父进程父进程读取到数据输出int pipefd[2];int ret pipe(pipefd);if(ret -1) {perror(pipe error);exit(0);}pid_t pid fork();if(pid 0) {char buffer[1024] {0};read(pipefd[0], buffer, sizeof(buffer)); // 如果管道为空此处阻塞printf(recieved : %s, buffer);} else if(pid 0) {char* content hello, im child process;write(pipefd[1], content, strlen(content));}return 0; }创建管道使用read和write分别在pipefd[0]中读数据在pipefd[1]中写数据。 运行结果如下 可见父进程中收到了子进程中传递的消息。 3. pipe管道的读写特点 使用管道时需要注意以下几种特殊的情况假设都是阻塞I/O操作 1.所有的指向管道写端的文件描述符都关闭了管道写端引用计数为0有进程从管道的读端 读数据那么管道中剩余的数据被读取以后再次read会返回0就像读到文件末尾一样。 2.如果有指向管道写端的文件描述符没有关闭管道的写端引用计数大于0而持有管道写端的进程 也没有往管道中写数据这个时候有进程从管道中读取数据那么管道中剩余的数据被读取后 再次read会阻塞直到管道中有数据可以读了才读取数据并返回。 3.如果所有指向管道读端的文件描述符都关闭了管道的读端引用计数为0这个时候有进程 向管道中写数据那么该进程会收到一个信号SIGPIPE, 通常会导致进程异常终止。 4.如果有指向管道读端的文件描述符没有关闭管道的读端引用计数大于0而持有管道读端的进程 也没有从管道中读数据这时有进程向管道中写数据那么在管道被写满的时候再次write会阻塞 直到管道中有空位置才能再次写入数据并返回。 总结     读管道          管道中有数据read返回实际读到的字节数。          管道中无数据                  写端被全部关闭read返回0相当于读到文件的末尾                  写端没有完全关闭read阻塞等待     写管道         管道读端全部被关闭进程异常终止进程收到SIGPIPE信号         管道读端没有全部关闭                 管道已满write阻塞                 管道没有满write将数据写入并返回实际写入的字节数 4. 有名管道 5. mkfifo函数 #include sys/types.h #include sys/stat.h int mkfifo(const char *pathname, mode_t mode);参数 pathname: 管道名称的路径mode: 文件的权限 和 open 的 mode 是一样的 是一个八进制的数 返回值成功返回0失败返回-1并设置错误号 6. 有名管道的注意事项 1.一个为只读而打开一个管道的进程会阻塞直到另外一个进程为只写打开管道 2.一个为只写而打开一个管道的进程会阻塞直到另外一个进程为只读打开管道 读管道     管道中有数据read返回实际读到的字节数     管道中无数据         管道写端被全部关闭read返回0相当于读到文件末尾         写端没有全部被关闭read阻塞等待 写管道     管道读端被全部关闭进行异常终止收到一个SIGPIPE信号     管道读端没有全部关闭         管道已经满了write会阻塞         管道没有满write将数据写入并返回实际写入的字节数。 7. 使用FIFO实现简单的聊天功能 chatterA.c: #include stdio.h #include unistd.h #include sys/types.h #include sys/stat.h #include fcntl.h #include stdlib.h #include string.hint main() {// 第一步首先判断有名管道是否存在int ret access(fifo1, F_OK);if(ret -1) {// 说明管道文件不存在则创建管道printf(管道不存在创建管道\n);ret mkfifo(fifo1, 0664);if(ret -1) {// 如果创建管道失败perror(mkfifo);exit(0);}}ret access(fifo2, F_OK);if(ret -1) {printf(管道不存在创建管道\n);ret mkfifo(fifo2, 0664);if(ret -1) {perror(mkfifo);exit(0);}}// 第二步以只写的方式打开fifo1以只读的方式打开fifo2// fifo1管道负责chatter1写chatter2读// fifo2管道负责chatter1读chatter2写int fd1 open(fifo1, O_WRONLY);if(fd1 -1) {perror(open);exit(0);}printf(打开fifo1成功等待写入...\n);int fd2 open(fifo2, O_RDONLY);if(fd2 -1) {perror(open);exit(0);}printf(打开fifo2成功等待读取...\n);// 第三步循环地往管道fifo1里写入数据char buffer[1024] {0};while(1) {// 把buffer置空以便重复写入memset(buffer, 0, 1024); // 获取标准输入的数据fgets(buffer, 1024, stdin);ret write(fd1, buffer, strlen(buffer));if(ret -1) {perror(write);exit(0);}// 第四步循环地从管道fifo2中读出数据memset(buffer, 0, 1024);ret read(fd2, buffer, 1024);if(ret 0) {perror(read);exit(0);}printf(chatterB传来消息: %s\n, buffer);}close(fd1);close(fd2);return 0; }chatterB: #include stdio.h #include unistd.h #include sys/types.h #include sys/stat.h #include fcntl.h #include stdlib.h #include string.hint main() {// 与chatterA完全对称往fifo2中写从fifo1中读int ret access(fifo1, F_OK);if(ret -1) {printf(管道不存在创建管道\n);ret mkfifo(fifo1, 0664);if(ret -1) {perror(mkfifo);exit(0);}}ret access(fifo2, F_OK);if(ret -1) {printf(管道不存在创建管道\n);ret mkfifo(fifo2, 0664);if(ret -1) {perror(mkfifo);exit(0);}}int fd1 open(fifo1, O_RDONLY);if(fd1 -1) {perror(open);exit(0);}printf(打开fifo1成功等待读取...\n);int fd2 open(fifo2, O_WRONLY);if(fd2 -1) {perror(open);exit(0);}printf(打开fifo2成功等待写入...\n);char buffer[1024] {0};while(1) {memset(buffer, 0, 1024);ret read(fd1, buffer, 1024);if(ret 0) {perror(read);exit(0);}printf(chatterA传来消息: %s\n, buffer);memset(buffer, 0, 1024); fgets(buffer, 1024, stdin);ret write(fd2, buffer, strlen(buffer));if(ret -1) {perror(write);exit(0);}}close(fd1);close(fd2);return 0; }在两个终端中分别运行程序 chatterA chatterB 在运行chatterA的终端中输入helloim chatterA 回车 chatterB 输出了chatterA中传来的信息同样在运行chatterB的终端中输入helloim chatterB 回车 chatterA
http://www.zqtcl.cn/news/930560/

相关文章:

  • 西安建设主管部门官方网站wordpress返回件
  • 建立免费空间网站南宁seo推广外包
  • 网站初期如何推广用秀米制作h5详细步骤
  • 做网站需要执照嘛开发 网站 团队
  • 怎么提交网站关键词包头人脸检测系统
  • 哪个网站开发是按月付费的婚纱摄影建设网站的目的
  • 站长之家app简单网站制作步骤
  • 网站开发与桌面应用开发wordpress if include
  • 网站怎么做预约小程序江苏省工程建设招标网站
  • python做网站有什么弊端专业做网带
  • 浙江建设工程考试网站wordpress等模版比较
  • seo网站论文高端疫苗
  • 山东省城乡住房和建设厅网站首页贵阳网站建设技术托管
  • 免费的网站申请做电影网站被告版权
  • 网站后台显示不全百姓网招聘信息最新招聘
  • 前端手机网站同企网站建设做网站
  • 重庆专业网站公司查看网站是否收录
  • 网站怎么做网上报名学多久可以做网站 知乎
  • 网站建设项目总结报告织梦模板建站
  • 关于网站建设的基础知识中石化十建公司官网
  • 江苏做网站怎么收费wordpress的wap插件
  • 企业营销网站建设公司哪家好网站建设团队名称
  • 法制网站建设问卷调查手机网站打开自动wap
  • 建设网站 如何给文件命名佛山网站推广市场
  • 网站客户问题解答网站建设网站规划书
  • 罗湖网站公司网络营销的种类有哪些
  • 怎么做微网站推广做一个自己的网站需要什么
  • 一个静态网站开发考虑什么最近一周新闻热点回顾
  • 北京网站设计知名乐云seo汝州建设局网站
  • 珠海左右创意园网站开发注册安全工程师报名条件和要求