需要准备的知识点:
1. linux网络编程,多线程,僵尸进程
2. 数据库范式和基本sql语句
3. 项目
4. Select,poll
5. 在fork前加上信号处理函数:
signal(SIG_CHLD, Proc_CHLD);
void Proc_CHLD(int SIGNO)
{
int pid = -1;
int stat;
while(pid=waitpid(0, &stat, WHNONG);
}
6. MFC消息机制,文档视图模型,生死之谜
7. Pthread_join是等待线程结束。Wait和waitpid是获取子进程的退出码,防止僵尸进程长期存在
8. .僵尸进程解决办法:
4.1 改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行 waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管对的默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
4.2 把父进程杀掉。父进程死后,僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
kill -9 `ps -ef | grep "Process Name" | awk '{ print $3 }'`
其中,“Process Name”为处于zombie状态的进程名。
4.3 杀父进程不行的话,就尝试用skill -t TTY关闭相应终端,TTY是进程相应的tty号(终端号)。但是,ps可能会查不到特定进程的tty号,这时就需要自己判断了。
4.4 实在不行,重启系统吧,这也是最常用到方法之一。
getpid() fork()的问题
fork()函数用于复制父进程,这个父进程是指当前进程吗?
如果是当前进程,为什么我pid=fork()获得的ID和pid=getpid()获得的ID不一样
pid=fork()与ppid=getppid()获得的ID也不一样
getpid()和getppid()也是分别获得当前的ID和父ID首先你得理解一个fork调用会返回两次,分别在父子进程中返回,并且返回值是不同的。
而fork以下的代码如果不加控制,就会分别在父子进程里面都继续执行下去。
要有效区分“当前”进程是父进程还是子进程的方法就是查看fork的返回值。
假如有一个进程,其pid为100,那么在这个进程来里面调用getpid()应该得到100。
接下来,该进程调用了fork(),产生了pid为101的子进程,那么
在原有的100进程(父)中,fork的返回值是101,也就是子进程的pid;
再次getpid()得到100,getppid()将得到祖父进程的pid,也就是既不是100,也不是101的其它值。
在新生的101进程(子)中,刚才产生了它本身的fork的返回值是0;
再次getpid()得到101,getppid()将得到100。
**的优势:
**提供给客户的不仅仅只是降低员工的需求,服务器综合维护成本降低,安全,全球化,效率提升。
自己思考的优势:还可以帮助游戏开发者,游戏开发团队,游戏开发公司提升知名度,打造游戏开发者的品牌。举例,开心农场的开发者实5分钟公司,开心农场在中国风靡,几乎人人皆知,但是很少有人知道开心农场是5分钟公司开发的。比如在人人网上,很多人玩开心农场,喜欢上开心农场,很自然以后人人网出了其他游戏,很多人会因为喜欢开心农场而且玩人人上的游戏,这就是所谓的爱屋及乌。但是问题出现了,现在假如5分钟公司出了一款新游戏,它没有在人人上发布运营,本来很多人喜欢开心农场,按理会支持5分钟公司的其他产品,但是由于5分钟公司知名度不高,很多人不知道开心农场是5分钟公司开发的,所以如果一旦5分钟公司把自己的产品发布到其他平台,就不一定有很多的受众。所以对于游戏公司来说,要打造自己的核心品牌,要让玩游戏的知道该游戏是自己公司开发的,之后,该公司发布游戏,就不用受制于运营商了。而**可以提供这个平台,不仅给游戏公司提供sns连接平台,更可以通过行云自己的平台来发布他们的游戏,**可以只是作为游戏的发布平台,游戏的所有者是游戏公司,从而帮助提高游戏开发公司的知名度。