Linux 多线程 网络编程 管道 socket等相关心得

来源:互联网 发布:电脑解压软件 编辑:程序博客网 时间:2024/05/17 03:12


1. IPC
信号量:ftok,semget/semctl/semop
信号:signal截取信号,可以自定义
管道:pipe,fd0,fd1,read/write,一边关闭读,一边关闭写,半双工
消息队列:ftok,msgget/msgctl
共享内存:ftok,shmget/shmat/shmdt,最快
套接字:socket
DBUS:消息总线,重量级
2. 睡眠
Sleep :second
Usleep:micro second 1/1000,000 second
3. 文件
Fctl:处理文件属性,根据cmd返回不同,例如F_GETFD,F_SETFD,F_GETFL,F_SETFL,F_GETOWN,F_SETOWN等
Ioctl:处理IO设备文件,发送命令,例如弹出光驱等
4. p_thread_join等待参数中的线程结束,阻塞的
p_thread_exit 手动退出线程,可以将返回值传给join线程
5. 线程的属性p_thread_attr_t
优先级,绑定状态,分离状态
6. 线程互斥
a. p_thread_mutext
b. 信号量:sem_init,sem_post,sem_wait,sem_destroy,sem_getvalue
c. 自旋锁:比较低级的锁,不睡眠,一直查看是否有锁释放,因此可以用于中断上下文
7. 线程同步与阻塞
p_thread_cond_wait,p_thread_cond_signa
8. 成员找组织
#define container_of(ptr, type, member)  (type *)( (char *)ptr - offsetof(type,member) )
9. Socket信号处理
signal(SIGPIPE, SIG_IGN);当client端close后,再有消息发送将给init进程处理
当服务器close一个连接时,若client端接着发数据。根据TCP 协议的规定,会收到一个RST响应,
client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。
10. Umask(0)
在创建新文件或目录时 屏蔽掉新文件或目录不应有的访问允许权限
这里设置为0,它的意思就是0取反再创建文件时权限相与,也就是:0) & mode 等于八进制的值0777 & mode
11. !!(condition)的结果只能是0和1
12. 文件mmap,映射到内存中
mmap操作提供了一种机制,让用户程序直接访问设备内存,这种机制,相比较在用户空间和内核空间互相拷贝数据,效率更高。在要求高性能的应用中比较常用。mmap映射内存必须是页面大小的整数倍,面向流的设备不能进行mmap,mmap的实现和硬件有关。
mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。
13. fstat 查看文件状态信息
14. Linux API与CAPI不同:
CAPI:fopen/fread:面向所有c程序员
Linux API: open/read,即系统调用,面向linux开发人员
C库函数的文件操作实际上是独立于具体的操作系统平台的,不管是在DOS、Windows、Linux还是在VxWorks中都是这些函数,一般会调用系统调用函数
15. 进程产生方式:
Fork: 常用,进程复制
System: 调用shell命令
Exec: 执行某个文件或者脚本
16. 让线程阻塞
a. While+sleep
b. 双重pthread_mutex_lock(&g_mutex_task_lock);其实单单创建线程本身是不用加锁的,加锁可能性:创建线程的同时使用了公共资源/双重lock实现阻塞
c. g_main_loop_run,最好,可以利用context及source注册event监听
17. 线程安全:
线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低依靠线程同步
在多线程环境中,当各线程不共享数据的时候,那么一定是线程安全的。问题是这种情况并不多见,在多数情况下需要共享数据,这时就需要进行适当的同步控制了。
18.   
http://www.mcdonalds.com.cn/cn/ch/restaurant-locator.html
国内麦当劳网站可以抓取到经纬度信息
       如何抓取动态网页中的特定内容
http://www.crifan.com/use_ie9_f12_to_analysis_the_internal_logical_process_of_login_baidu_main_page_website/
       简言之,
a. 就是IE打开一个网页,按F12
b. 第二行 HTML|CSS|控制台|脚本|探查器|网络, 选择 “网络”,点击 “开始捕获”,
c. 然后操作网页,比如执行 跳转到第3页, 下面可以看到捕获的信息,
d. 点击 “跳转到详细视图”, 有请求标头请求正文等,标头和正文组合既可以得到请求地址
http://rl.mcdonalds.com.cn/rl/index.php?curpage=3&province=%E4%B8%8A%E6%B5%B7&city=&type2=&address=&range=
19. 为什么有时候需要两次g_source_unref(timer);
原因:例如g_source_attach的时候引用计数又自增了一次,算是一种保护措施吧
20. sockaddr_un: unix IPC
sockaddr_in: Inet socket
由于结构体大小与sockaddr一样,因此强转没问题
AF_INET=PF_INET,Inet通信IPv4
AF_UNIX=AF_LOCAL,本地通信
21. accept位于循环体中,之后不可使用耗时操作,应用类似BH机制。
好的是:listen会将client请求放入队列中,accept来消耗队列
signal(SIGPIPE, SIG_IGN);处理信号,可以截取信号,处理自定义函数
22. setsockopt放在socket后,bind前
sock_fd.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,True)
重用绑定的端口,防止出现98错误
23. python把SIGPIPE用异常替代了
24. 广播:不能应用与广域网,不能使用tcp,它是基于udp的
25. 多播,又叫组播,可以 应用与广域网,需要路由器支持igmp协议,基于udp的
26. Linux2.6内核提供了epoll取代之前的select,属于IO多路复用技术,提升服务器性能;LT和ET(套接字一定要非阻塞的)两种

 

0 0
原创粉丝点击