线程的同步问题 同一个进程内的各个线程,共享该进程内的全局变量 如果多个线程同时对某个全局变量进行访问时,就可能导致竞态。解决办法,对临界区使用信号量、或互斥量。信号量和互斥量的选择。 对于同步和互斥,使用信号量或互斥量都可以实现。 使用时,选择更符合语义的手段: ... Read More
线程问题 使用fork创建进程以执行新的任务,该方式的代价很高。解决办法:使用线程什么是线程 线程,是进程内部的一个控制序列。 即使不使用线程,进程内部也有一个执行线程。类比:创建一个进程,类似于“克隆”一个家庭。 该“家庭”与原来的家庭完全相同 但... Read More
守护进程什么是守护进程 守护进程,也称Daemon进程 守护进程,是Linux的后台服务进程。普通进程和终端的关系: 用户与系统交流的界面,称为“终端”。 当在某个终端上运行某个进程时,该终端就称为该进程的“控制终端”。 当控制终端关闭时,它对应的进程(在该终端上启动的进程)都将被... Read More
孤儿进程与僵尸进程什么是孤儿进程、僵尸进程 1) 孤儿进程 父进程先结束,则其子进程变成“孤儿进程”。 变成孤儿进程之后,该进程由init接管并清理(认init作为父进程)实例:main1.c 2) 僵尸进程 子进程结束后的状态,取决于该子进程结束时,其父进程的状... Read More
问题 在开发过程中,因为开发和测试的目的,使用了很多信号量、共享内存、消息队列等。 而由于开发过程的不确定性,这些已申请的IPC资源常常没有删除, 导致这些资源的浪费,并可能对实际程序造成影响。解决办法 使用IPC状态命令,查看(ipcs)并删除(ipcrm)已使用IPC资源。用法... Read More
main1.c#include #include int main(void) { int i; for (i=0; i#include #include #include #include #if defined(__GNU_LIBRARY__) && !define... Read More
信号量问题 程序中,有时存在一种特殊代码, 最多只允许一个进程执行该部分代码。 这部分区域,称为“临界区”然而在多进程并发执行时,当一个进程进入临界区,因某种原因被挂起时, 其他进程就有可能也进入该区域。解决办法:使用信号量什么是信号量 信号量,是一种特殊的变量。 只能对信号量执行... Read More
main1/msg_rcv.c#include #include #include #include #include #include #include #define MSG_SIZE 80struct my_msg_st { long int msg_type; ... Read More
消息队列什么是消息队列 消息队列,用于从一个进程向另一个进程发送数据。 但仅把数据发送到一个“队列”中,而不指定由哪个进程来接受。 消息队列,独立与发送消息的进程和接收消息的进程。 (信号、管道、命名管道都不独立与发送和接收进程)消息队列,有最大长度限制:MSGMNB 消息队列中的... Read More
main_r.c#include #include #include #include #include #include #include #include #define SHM_SIZE 100int main(void){ int shmid; char bu... Read More
共享内存 1 什么是共享内存 使得两个不同的进程共享一段逻辑内存,实际上都实现为共享同一段物理内存。 原理如下图: 2 共享内存的使用 2.1共享内存的获取 原型:int shmget (key_t key, size_t size, int shmflg); 参数:... Read More
main.c#include #include #include #include #include #include #include #include int main(void){ int fd = 0; fd_set read_set; struct ti... Read More
多路复用select问题 当需要等待某个或多个设备(文件)可读或可写时, 如果使用循环不停地检测是否可读可写,则效率很低。解决办法: 使用select系统调用。 select的用法 man 2 selectint select(int nfds, fd... Read More