随笔分类 - Linux
摘要:pthread_join函数 阻塞等待线程退出,获取线程退出状态 其作用,对应进程中 waitpid() 函数。 int pthread_join(pthread_t thread, void **retval); 成功:0;失败:错误号 参数:thread:线程ID (【注意】:不是指针);ret
阅读全文
摘要:互斥量mutex 进程间也可以使用互斥锁,来达到同步的目的。但应在pthread_mutex_init初始化之前,修改其属性为进程间共享。mutex的属性修改函数主要有以下几个。 主要应用函数: pthread_mutexattr_t mattr 类型: 用于定义mutex锁的【属性】 pthrea
阅读全文
摘要:借助 fcntl函数来实现锁机制。 操作文件的进程没有获得锁时,可以打开,但无法执行read、write操作。 fcntl函数: 获取、设置文件访问控制属性。 int fcntl(int fd, int cmd, ... /* arg */ ); 参2: F_SETLK (struct flock
阅读全文
摘要:进化版的互斥锁(1 --> N) 由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降。线程从并行执行,变成了串行执行。与直接使用单进程无
阅读全文
摘要:条件变量: 条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。 主要应用函数: pthread_cond_init函数 pthread_cond_destroy函数 pthread_cond_wait函数 pthread_cond_timedwait函数
阅读全文
摘要:读写锁 与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。 读写锁状态: 一把读写锁具备三种状态: 1. 读模式下加锁状态 (读锁) 2. 写模式下加锁状态 (写锁) 3. 不加锁状态 读写锁特性: 读写锁也叫共享-独占锁。当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁
阅读全文
摘要:控制原语对比 进程 线程 fork pthread_create exit pthread_exit wait pthread_join kill pthread_cancel getpid pthread_self 命名空间 线程属性 本节作为指引性介绍,linux下线程的属性是可以根据实际项目需
阅读全文
摘要:pthread_detach函数 实现线程分离 int pthread_detach(pthread_t thread); 成功:0;失败:错误号 线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。 进程若有该机
阅读全文
摘要:pthread_exit函数 将单个线程退出 void pthread_exit(void *retval); 参数:retval表示线程退出状态,通常传NULL 思考:使用exit将指定线程退出,可以吗? 【pthrd_exit.c】 结论:线程中,禁止使用exit函数,会导致进程内所有线程全部退
阅读全文
摘要:同步概念 所谓同步,即同时起步,协调一致。不同的对象,对“同步”的理解方式略有不同。如,设备同步,是指在两个设备之间规定一个共同的时间参考;数据库同步,是指让两个或多个数据库内容保持一致,或者按需要部分保持一致;文件同步,是指让两个或多个文件夹里的文件保持一致。等等 而,编程中、通信中所说的同步与生
阅读全文
摘要:pthread_self函数 获取线程ID。其作用对应进程中 getpid() 函数。 pthread_t pthread_self(void); 返回值:成功:0; 失败:无! 线程ID:pthread_t类型,本质:在Linux下为无符号整数(%lu),其他系统中可能是结构体实现 线程ID是进程
阅读全文
摘要:什么是线程 LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下) 进程:独立地址空间,拥有PCB 线程:也有PCB,但没有独立的地址空间(共享) 区别:在于是否共享地址空间。 独居(进程);合租(线程)。 Linux下: 线程:最小的执行单位 进程:最小
阅读全文
摘要:守护进程 Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以d结尾的名字。 Linux后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输
阅读全文
摘要:创建会话 创建一个会话需要注意以下6点注意事项: getsid函数 获取进程所属的会话ID pid_t getsid(pid_t pid); 成功:返回调用进程的会话ID;失败:-1,设置errno pid为0表示察看当前进程session ID ps ajx命令查看系统中的进程。参数a表示不仅列当
阅读全文
摘要:SIGCHLD的产生条件 子进程终止时 子进程接收到SIGSTOP信号停止时 子进程处在停止态,接受到SIGCONT后唤醒时 借助SIGCHLD信号回收子进程 子进程结束运行,其父进程会收到SIGCHLD信号。该信号的默认处理动作是忽略。可以捕捉该信号,在捕捉函数中完成子进程状态的回收。 分析该例子
阅读全文
摘要:/*** sync_process.c ***/ #include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> int n = 0, flag = 0; void sys_err(char *str) { perror(str); exit(1); } void do_sig_child(int num
阅读全文
摘要:pause函数 调用该函数可以造成进程主动挂起,等待信号唤醒。调用该系统调用的进程将处于阻塞状态(主动放弃cpu) 直到有信号递达将其唤醒。 int pause(void); 返回值:-1 并设置errno为EINTR 返回值: ① 如果信号的默认处理动作是终止进程,则进程终止,pause函数么有机
阅读全文
摘要:信号捕捉特性 练习1:为某个信号设置捕捉函数 【sigaction1.c】练习2: 验证在信号处理函数执行期间,该信号多次递送,那么只在处理函数之行结束后,处理一次。 【sigaction2.c】练习3:验证sa_mask在捕捉函数执行期间的屏蔽作用。 【sigaction3.c】 内核实现信号捕捉
阅读全文
摘要:sigaction函数 修改信号处理动作(通常在Linux用其来注册一个信号的捕捉函数) int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 成功:0;失败:-1,设置errno 参数:
阅读全文
摘要:信号集操作函数 内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在应用程序中自定义set来改变mask。已达到屏蔽指定信号的目的。 信号集设定 sigset_t set; // typedef unsigned long sigset_t; int si
阅读全文