Linux操作系统包括三种不同类型的进程,一般分为交互进程、批处理进程和守护进程三类。交互进程是由一个终端(Shell)启动的进程,它既可以在前台运行,也可以在后台运行。批处理进程和终端没有联系,是一个由脚本启动的进程序列。守护进程总是活跃,在系统启动时通过脚本自动启动,或由root启动,通常在后台运行,直到系统关闭时退出。一个进程可以拥有子进程。当父进程终止时,它的子进程也随之终止;而子进程终止时,父进程通常可以继续运行。Linux系统中,init 进程是内核启动的第一个用户级进程,它有许多很重要的任务,比如象启动getty(用于用户登录)、维护运行级别、处理孤儿进程等,所有进程都是它的子进程。 阅读全文
我们在编写应用程序的过程中,通常会遇到这样的情况,因为某些原因,程序被系统多次或者反复调用,导致程序耗尽系统内存或者出现不可预知的错误,最终影响到程序原本的设计需求,这显然不是我们所希望看到的结果,但是如果在程序内部加上必要的判断,不管系统是否多次调用,都能防止同一时刻多个同样的程序同时运行。 阅读全文
之前有一篇文章《Netlink实现Linux内核与用户空间通信》专门介绍了Netlink相比其他内核交互方式的优点以及Netlink的调用方法,并以NETLINK_KOBJECT_UEVENT(内核事件向用户态通知)为例演示了U盘热插拔信息的捕捉,衍生出另一篇文章《Linux下自动检测USB热插拔》,今天尝试用Netlink来捕捉一下网络接口信息,实现的主要功能是实时打印发生变化的网络接口的序列号、上下线状态和接口名称。 阅读全文
现在主流视频网站都是采用Flash播放器播放视频的,视频格式皆为flv,比如Youtube、优酷、土豆网、奇艺网、音悦台等等。我们在这些视频网站观看了喜欢的视频以后,有没有将其提取到本地,然后保存的欲望呢?我们知道,很多视频网站针对Windows都有专门的视频下载客户端,但是却没有一家网站为Linux开发客户端,所有我们不得不自己动手,设法从缓存文件中提取视频文件。 阅读全文
我们知道,一个程序至少有一个进程,而一个进程至少包含一个线程,对于单进程单线程程序,要想完成多任务,一定是单步顺序执行的,即多个任务无法并发执行,一个任务的开始需要等待前一个任务的结束,对于并发性要求极高的服务器程序来说,单线程显然无法高效地处理任务。这时我们可以考虑采用多进程或多线程机制来封装程序。 阅读全文
设置端口复用,我们调用setsockopt()函数,并使用SO_REUSEADDR和SO_REUSEPORT选项。
一、SO_REUSEADDR主要有4方面的作用:
1、允许一个监听服务bind到现在正在被使用的端口上
例如: (1)创建一个套结字并bind到7080端口上,listen该套结字
(2)一个客户端connect该端口,accept该连接并转交给派生出来的子进程
(3)close监听套结字(注意此时子进程维护的客户端过来的连接依然存在)
(4)重新创建套结字并bind该7080端口,listen该套结字
最后一部在bind的时候会报错“Address already in use”,如果在bind之前用setsockopt设置SO_REUSEADDR选项,则不bind不会报错。 阅读全文