1.进程:ps,getpid(),fork(),>
getpid库函数功能是获取进程编号
多进程
下面第一行是父进程,第二行是子进程
进程应用,并发的概念如下
并发的应用,以下在服务端中
以下服务端中
下面为分析上面的代码
2.信号:signal(.,EXIT)
如何让程序在后台运行
信号对进程而言
如下信号名实质上就是宏
如上子进程结束会向父进程发送信号名为SIGCHLD
,如果父进程没有处理这个信号,那这个子进程就变成了僵尸进程。
信号值11就是自己非法使用空指针或者乱用地址,和信号值9一样就算加上忽略代码也不能被忽略。
如上第三种恢复信号处理方法默认值一般不用,自定义函数如下EXIT函数
下面 EXIT函数就是自定义函数,TcpServer设为全局变量因为EXIT函数要访问它并关闭socket
如下ctrl+c和kill/kill all命令都能调用EXIT函数来关闭进程,不叫杀进程了,叫通知退出
下面是操作系统kill命令发信号,不是C语言kill函数。kill不能杀其他用户进程
kill函数的返回值为0成功,-1失败。这个特点会用在进程的监控上,下面argv[1]就是kill第一个参数即pid编号,argv[2]第二个参数 是信号值
3.进程间通信:shmget()
进程数据空间是相互独立的,不能互相访问。但某些情况下进程间需要互相通信来完成系统某项功能或交换数据
如下是进程通信场景
消息队列类似socket,不过只能在本机。一般共享内存和信号灯结合起来用
5.示例程序:对指针操作相当于对共享内存操作
写入的就是字符串"本程序的进程…",有redis就不用自己写共享内存
4.多线程:pthread_create()
第一个参数中pthread_t(数据类型):typedef unsigned long int pthread_t,无符号长整型
新客户端连上启动一个线程而不是进程,下面为查看线程主函数怎么写,pthread_create是C语言库函数
将thread_start改为pth_main(线程主函数)
如下就按照上面形式这么写
下面在服务端中
下面打印出socket
如上(void*)ii = void*arg
单进程多线程:只杀进程(不存在杀线程),进程杀了线程自动退出
多进程:父进程被杀,子进程不退
多线程会出现赋值没完成线程切换,值被取走,值就不是原来那个值
5.线程同步:pthread_mutex_t
pthread_mutex_t 结构体。数据输入:网页登陆。数据展示:java,微软的.net,c#。共享资源:全局变量
,全局对象
(数据库连接词,socket,日志文件对象)
打开方式为a+,因为日志文件不断在末尾追加内容
如上book242没有把内容写在屏幕上而是写到了日志文件
killall book242 杀死进程后上面查看.log文件就可显示,以下修改为可选缓冲区写解决缓冲问题
多个线程用logfile共享资源,可能会出问题(文件内容写错乱),给logfile定义一个锁,一个共享资源一个锁
上面运行和之前写入日志一样,表面看不出效果,以下修改睡一秒
20个客户端发30个报文不是一闪而过了,锁锁住了1秒,所以发完要(20*30)秒