IPC机制之消息队列 消息队列是消息在传输过程中保存消息的容器,它提供了一种从一个进程向另一个进程发送数据块的方法。而且,每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型值的数据块。 消息队列的优点是可以通过发送消息来完全避免命名管道的同步和阻塞问题,甚至可以用一些方法来提前查看紧急消息。其缺点是:与管道一样每个数据块都有一个最大长度限制,系统中所有队列所包含的全部数据块的总长度也有...
IPC机制之共享内存 同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。所以必须要某种同步机制来保证该共享内存中资源的准确性。共享内存相关函数shmget()创建共享内存并返回标识符头文件 #include<sys/shm.h>int shmget(key_t key, size_t size, int shmflag...
IPC机制之信号量及pv操作 关于IPC我们要知道的一些内容什么是IPC?答:IPC 全称 Inter-Process Communication,我们可以按照其字面意思来理解,就是指进程间沟通的一种方法。其实我们以前就接触过一些IPC机制,只是当时我们还没有认识到,那就是:管道和信号,这两者都可以达到进程间通信的目的。其实IPC机制还有信号量,共享内存,消息队列,套接字。我们之后会一一介绍,本篇先介绍信号量。什么...
Linux中的用户配置文件(passwd、shadow、group、gshadow) 一、用户信息文件 : /etc/passwd首先我们可以使用命令man 5 passwd查看以下 passwd 文件的格式我们看出 passwd 文件的格式是由七个字段组成,每个字段通过冒号分隔,并且每一行代表一个用户。下面我们将通过我个人的passwd文件作为模板,详细介绍每一个字段的含义。第一字段 :用户名称(account)这个字段没什么可说的,就是用户个人的用户...
输入输出重定向 输出重定向输出重定向,为的是将本应输出的屏幕上的写入到指定文件或设备中去。其方式为:命令 > 文件 :以覆盖的方式,把命令的输出写入文件命令 >> 文件 :以追加的方式,把命令的输出写入文件前提是,这个命令得有输出才行,比如:cd命令在没有发生错误的情况下是不会产生输出的。首先,让我们来做一个测试,首先我们创建两个空白文件,file_out 和fil...
管道 在上一篇博客,我们看到了一种在两个进程间发送消息的非常简单的方法:使用信号,但传送的信息只限于一个信号值。而通过管道(pipe)进程之间可以交换更有用的数据。管道的本质是内核缓冲区,所以不占用磁盘空间,而且其读端和写端都是默认阻塞的。管道也有其局限性,由于管道是通过环形队列实现的,所以管道中的数据只能读一次,不能重复读取。无名管道的创建及使用 ...
寄雁传书谢不能——Linux中的信号 什么是信号信号是unix和Linux系统响应某些条件而产生的一个事件。简单的理解信号就是一种Linux/unix环境下进程间通讯的一种机制,用来提醒进程一个事件已经发生。 信号是软件中断,是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到...
西城杨柳弄春柔——系统调用 什么是系统调用?系统调用是应用程序与操作系统内核之间的接口,它决定了应用程序是如何与内核打交道的,无论程序是直接进行系统调用,还是通过运行库,最终还是会到达系统调用这个层面上,系统调用实现在内核中。系统调用的意义?在现代的操作系统里,程序运行的时候,本身是没有权利访问多少系统资源的,由于系统有限的资源有可能被多个不同的的应用程序同时访问,因此,如果不加以保护,那么各个应用程序难免产生冲...
孤儿进程和僵尸进程 一、进程 进程可以看做程序的一次执行过程。在linux下,每个进程都会被分配一个唯一的数字编号,我们称之为进程标识符或PID。PID是一个从1到32768的正整数,其中1一般是特殊进程init,其它进程从2开始依次编号。当用完32768后,从2重新开始。 在一台单处理器的计算机上,同一时间只有一个进程可以运行,其他程序处于就绪状态,该状态表示程序只要得到CPU就可以运...
一点樱桃启绛唇——C语言反斜杠 “\” 的意义 1. 有些字符,如:回车、换行、制表符等没有现成的字符代号,所以用反斜杠“\”和其后的一个字符作为一个整体来看待,用来代表他们。所以反斜杠“\”作为转义字符的开端存在,其本身被赋予了这一特殊意义。2. 在C语言中,很多字符有其特殊含义,如:双引号代表其中内容为字符串,单引号是单个字符,还有我们刚才说的反斜杠“\”,是转义符的开端。但有时候我们只需要使用这些普通的符号,却总是会被系统误认为其...
心有灵犀一点通——初识结构体 结构体(structre):用户自己建立的,由不同类型数据组成放入组合型的数据结构。下面我们声明一个结构体名为Student的结构体类型,有2个成员,char型和int 型struct Student{ char name[20]; int age; }我们由下面这张图对其进行详细分析: 声明完成后,我们就可以...
寂寞空庭春欲晚——动态内存 使用动态内存分配时必须的头 #include<stdlib.h> 或#include<malloc.h> 一、malloc 函数(memory allocation 内存分配) :用于申请一块连续的指定大小的内存区域,如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定,是随机的垃圾值),否则返回空指针NULL。例如:int *p1 = (...
一剑霜寒十四州——浅析内存分区(浅显) 以上是我们对内存区域的一个简单的划分,其中包括:代码段、全局(静态)变量区、栈以及堆,接下来让我们看看一些常见的内容分别位于哪个区域内,并对其生命周期、作用域、默认值、链接属性进行总结。 一、全局变量:定义在函数外部的变量生命周期:从程序运行开始创建,程序结束销毁(太占内存)作用域:从定义该变量开始,一直到文件的结束默认值:0内存区域:全局(静态)变量区链接属...
铁马冰河入梦来——从源文件到可执行文件(待后续) 假如在Linux系统终端,我们创建了一个.c文件,如:main.c,我们可以通过以下指令来运行它。 gcc -o main main.c 这个时候会增加一个叫做 main 的文件。然后输入下一条指令: ...
日映岚光青锁翠——二维数组 我们知道二维数组一般是这样定义的:int arr[3][4] = {{1,2,3,4},{5,6,7,8,},{9,10,11,12}};当然也可以这样定义int arr[][4] ={{1,2,3,4},{5,6,7,8},{9,10,11,12}}int arr[][4] ={1,2,3,4,5,6,7,8,9,10,11,12}我们可以省略行号不写,因为系统可以根据每行的...
鸿雁长飞光不度——字符串常量与字符数组 char arr[ ] = “abcde” //字符串char brr[10] = {‘a’,‘b’,‘c’} //字符串char crr[ ] = {‘a’’b’’c’’d’’e’}; //字符数组char *drr = “abcde”; ...
画梁春尽落香尘—— C语言中const 规则探究 一、数据类型对const而言是透明的。例如: const int a = 100; int const a = 100; const可以放在数据类型的两侧,两者是等价的。 二、const 用于封锁直接修饰的内容,并将该内容的属性变为只读例如: 1、 int cons...
指针和数组的关系及本质 文章开始我们先解释一下为什么 arr[i] == *(arr + i) 。在C语言中,数组名代表的是数组中首元素的地址。在程序编译时,arr[i] 是按照 *(arr + i)处理的,即按照数组元素的首地址加上相应位移量找到新元素的地址,然后解引用,便得到此处的值。接下来我们定义一个整形指针,通常会这么写 int *p = arr;这里为了方便理解我这样写也可以int *p;p = ...
指针运算探究 有以下程序:int main(){ int arr[] = {1,2,3,4,5,6,7,8,9,10}; int *p = arr; *p = 10; p++; *p = 20; printf("十进制 %d,%d",arr[0],arr[1]); printf("十六进制 %08x,%08x",arr[0],arr[1]); return 0;...
形参与实参 在C语言中,我们经常用到形参和实参这一对双生姐妹花,就像《大话西游》里的紫霞和青霞。比如我们可以用她们来达到一些很简单的需求,还是从经典的交换两个数字a,b的值开始。我们有以下程序:void Swap(int x,int y){ int tmp; tmp = x; x = y; y = tmp; printf("%d,%d",x,y);}int mai...