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

网站失败的原因wordpress 安装主题 ftp

网站失败的原因,wordpress 安装主题 ftp,无锡华士镇网站建设,搜索引擎优化的目标起因介绍 一位朋友问我一个关于socket通信的相关问题#xff0c;其需要解决的问题如下#xff1a; 需要存在一个服务器进程#xff0c;服务器进程会进行监听#xff0c;负责建立与客户端的socket连接#xff0c;同时可以存在多个客户端进程#xff0c;客户端进程之间可以…起因介绍 一位朋友问我一个关于socket通信的相关问题其需要解决的问题如下 需要存在一个服务器进程服务器进程会进行监听负责建立与客户端的socket连接同时可以存在多个客户端进程客户端进程之间可以进行通信不过客户端之间并不会建立socket连接通信是通过将信息发送给服务端进程服务端进程查找与目标客户端建立的socket标志来进行信息的发送。 为了解决上面的问题这位朋友在服务端进程中自定义了一个链表用于保存与服务器建立的socket连接的客户端名称以及对应的socket标识符当成功建立连接的时候则在链表中插入一个元素当一个客户端发送退出指令的时候则将对应的socket关闭并将信息从链表中删除每次有客户端需要发送数据的时候则需要遍历链表然后找到目标socket进行通信。 同时为了实现通信的要求则必须要使用多进程或者多线程这位朋友在服务端的代码中每次监听成均通过fork来建立一个子进程来处理与某个客户端之间的通信同时这位朋友在代码中申请了一块共享内存用于保存链表头。 出现的问题 上述的描述似乎是很合理的但是他在运行后出现了一个奇怪的现象当服务端进程启动后同时启动两个客户端进程与服务端进程建立socket连接当client1向client2发送消息的时候代码出现了死循环。 哪里出现了死循环呢根据朋友的调试发现死循环出现在在链表中查询目的socket的过程他发现链表变成了一个环同时这个链表上只有一个结点也就是只有自己的结点信息导致一直在链表上进行循环。 问题的原因 为什么会出现死循环呢出现问题的关键就在于他使用fork这个函数。为了更加简单的进行描述我们先进性一个简单的实验 编写一个程序同时创建一个变量对其进行赋值然后调用fork()查看是否父子进程均能获取变量的正确值同时尝试在子进程中对变量的值进行修改父进程等待子进程完成后查看变量的值看一下值是否成功被修改。 注上面的问题实际上来自于《操作系统导论》非常好的一本书推荐大家阅读。 可以很容易的写出上面实验的代码 #include stdio.h #include unistd.h #include stdlib.h #include sys/wait.hint main() {int x 137;int ret fork();if (ret 0) {printf(one error occurs when fork(), the ret: %d.\n, ret);exit(ret);} else if (ret 0) {printf(child process (%d), the value of x is: %d.\n, getpid(), x);x * 2;} else {printf(parent process (%d), the value of x is: %d.\n, getpid(), x);ret wait(NULL);printf(after child process write the varible, parent process (%d), the value of x is: %d.\n, getpid(), x);}return 0; }运行结果如下 parent process (110), the value of x is: 137. child process (111), the value of x is: 137. after child process write the varible, parent process (110), the value of x is: 137. 可以看到子进程对于变量的修改父进程并不知道。这就是问题所在通过fork创建的进程会复制父进程的所有信息注意是复制而不是共享一个通过fork创建的进程对变量的修改对于另一个进程不可见。 上面说的复制指的是将进程完整的拷贝一遍放到另一块内存区域中进行执行这会有一个问题也就是初始两个进程所有的值都是一样的同时虚拟地址也是一样的这一点体现在如果两个进程紧接着进行堆内存的申请那么会在会获得同样的地址这一点也很好理解由于是复制那么自然堆的状态也是一样的获取到同样的虚拟空间也是合理地但是实际的物理空间却不相同。 有了上面的基础我们再来看思考一下为什么会出现死循环 问题的关键在于同时使用了共享内存和fork使用的共享内存能够保证在子进程中进行修改其他进程能够看见我们来实际进行模拟一下 首先服务端进程进行启动申请共享内存地址我们记为0用headp_address变量保存该地址即headp_address0由于此时的链表是空的表头初始为空即执行*headp_addressNULLclient1启动此时向链表中插入一个新的结点新结点通过malloc进行申请内存假设此时申请的地址为4那么我们将该节点插入到链表头即执行*headp_addressnew_node此时new_node4client2启动此时同样进行新结点内存的申请通过malloc根据之前的结论此时会申请到相同的内存即还是会申请到4这里是虚拟内存但是由于对于共享内存上的修改两个进程能够发现此时发现链表中已经有一个元素了于是使用头插法将当前的结点插入到链表的开头也就是执行new_node-next *headp_address; *headp_addressnew_node;根据前面的信息我们知道*headp_address4在执行上面的语句之后我们发现*headp_address4, *headp_address-next4也就是说这个时候链表变成了一个环这也就是为什么后面通过某个客户端进行信息的发送的时候会出现死循环。 问题的解决 这里提供几种解决方案 使用pthread替换fork()pthread可以实现子线程进行修改各个进程能够看到也就是说其更偏向与实现共享的功能而fork()则是偏向于复制。实际上这两个函数都调用了系统调用clone但是pthread_create在调用的时候增加了CLONE_VM标志使得能够实现共享。如果一定要使用fork()则应该通过共享内存实现共享也就是链表的申请与释放也应该在共享内存上进行这个时候则应该使用静态链表进行管理也就是固定空间大小的链表。如果要同时使用fork()和动态链表我并没有想到什么比较好的方法。
http://www.yutouwan.com/news/192188/

相关文章:

  • 2022建站市场wordpress 搜索框 404
  • 深圳ccd设计公司官网东营网站seo
  • 网站开发方向和移动开发方向那个好手机建设银行官方网站
  • 扬子科技网站建设每月网站流量
  • 赣榆哪里有做网站的营销型网站建设实训报告
  • 网站背景怎么做电商网站可以用dw做
  • 如何免费做网站域名航空网站建设
  • 网站文章排版的重要性开发网站要多少钱
  • 住房和城乡建设部建造师网站介绍网站ppt该怎么做
  • 制作自己的网站 域名怎么弄大庆企业做网站
  • 河源网站开发怎样建设的网站好优化好排名
  • 网站设计教程网站深圳比较出名的外贸公司
  • 无锡惠山区建设局网站广告设计与制作软件哪个好
  • 促销网站怎么做2017做那个网站能致富
  • 合肥做网站哪家公司好帝国网站管理系统教程
  • 现在网站开发模式南阳做网站 汉狮公司
  • 做网站的销售能干什么南京网络建站模板
  • 虾米音乐歌曲链接做qq音乐网站网站设计结构图用什么做
  • 织梦网站列表做网站设计赚不赚钱
  • 抓取wordpress站点用户百度关键词优化专家
  • 无线设置网站没有收款接口网站怎么做收款
  • 莱芜网站快排成都网站海口网站建设
  • app开发做网站备案 网站名称 重复
  • 怎么给网站做友情链接雏鸟短视频app软件下载网站
  • wordpress插件感应侧边栏推广优化师
  • 十大卖衣服网站网络推广团队需要哪些人手
  • 南京网站开发建设网站管理员怎么做联系方式
  • 网站开发的兼职网站湛江网站模板
  • 个人主页网站html全新升级网站
  • 百度自动驾驶技术南昌seo推广外包