02进程间的通信
02.进程间的通信[TOC]
1、管道1.1、无名管道(1)创建无名管道1234#include <unistd.h>int pipe(int pipefd[2]);//参数 一个至少具有 2 个int 型数据的数组,用来存放 PIPE 的读写端描述符//返回值 成功 0 失败 -1
(2)无名管道特征
①没有名字,因此无法使用 open( )。
②只能用于亲缘进程间(比如父子进程、兄弟进程、祖孙进程……)通信。
③半双工工作方式:读写端分开。
④写入操作不具有原子性,因此只能用于一对一的简单通信情形。
⑤不能使用 lseek( )来定位。
1.2、有名管道(1)创建有名管道12345#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);//参数 pathname:FIFO的文件名 mode:文件权限//返回值 成功 0 失败 -1
(2)有名管道特征
①有名字,存储于普通文件系统之中。②任何具有相应权限的进程都可以使用 ...
12.1动态库
一、动态库1、创建动态库
-I 查看头文件所在目录(大i)
2、编译源文件并链接到库文件
3、设置环境变量3.1临时设置:在命令行中进入你的动态库文件所在路径:1export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)
如果你当前工作路径不在库文件所在的路径:1export LD_LIBRARY_PATH=/mnt/hgfs/CQ2012/02_C语言/12_动态库与静态库/code/dynamic
3.2永久设置第一种:直接将我们的动态库文件复制到系统的lib目录下 (/lib/ 或者 /usr/lib/)
sudo cp libmylib.so /lib/
第二种:将环境变量设置到系统的一个配置文件中 /etc/bash.bashrc
①sudo gedit /etc/bash.bashrc
②找到文件末尾,换行写入:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH ...
11高级议题
一、宏1.#define的使用1.1预处理 编译 汇编 链接1预处理:gcc define.c -o define.i -E 编译生成.i文件,使代码停留在这个阶段
1.2标识符命名规则①只能由数字、字母、下划线组成
②不能以数字开头
③不能是C语言关键字
15za _he xxx A#a b^sss sdfg2 a_af2* break
1.3 宏延续运算符 \ 表示逻辑上连成一行12#define d(x, y) x = (7 + \ y + x)
2.define定义常量宏2.1基本用法12#define N 100#define PI 3.14
2.2取消宏标识符PI的声明1#undef PI
3.define的带参宏3.1宏定义的表达式都加上括号,传入参数可能是表达式1#define X(a) ((a) * (a))
防止参数类型不一致,typeof(a) 获取表达式a的结果类型,定义一个变量存储它的值 {}把这一段看成一个整体 (void)(&_a == &_b); 检查两个比较参数 ...
01单向链表
一、单向链表链表结构体123456typedef int DataType;typedef struct Node{ DataType data;//数据域 struct Node *next;//指针域}linknode;
1、初始化链表
12345678910// 初始化链表struct Node *init_list(void){ struct Node *head = malloc(sizeof(struct Node)); if(head != NULL) { head->next = NULL; return head; } return head;}
2、创建一个节点1234567891011// 创建一个新节点struct Node *create_node(DataType data){ struct Node *new = malloc(sizeof(struct Node)); if(new != NULL) { new->data = data; ...
02单向循环链表
二、单向循环链表链表结构体123456typedef int DataType;struct Node{ DataType data;//数据域 struct Node *next;//指针域};
1、初始化链表
12345678910// 初始化链表struct Node *init_list(void){ struct Node *head = malloc(sizeof(struct Node)); if(head != NULL) { head->next = head; return head; } return head;}
2、创建一个节点
1234567891011// 创建一个新节点struct Node *create_node(DataType data){ struct Node *new = malloc(sizeof(struct Node)); if(new != NULL) { new->data = data; // 类型都是DataType, ...
03链表管理结构体
三、链表管理结构体123456struct List{ struct Node *head; struct Node *tail; int len;};
1、初始化链表123456789101112131415161718// 初始化链表struct List * init_list(void){ struct List *list = malloc(sizeof(struct List)); if(list == NULL) { return NULL; } // 分配头节点空间 list->head = malloc(sizeof(struct Node)); if(list->head == NULL) return NULL; list->tail = list->head; list->len = 0; return list;}
2、尾插1234567// 尾插void insert_tail(struct Node *new, struct List * list) ...
04双向循环链表
一、双向循环链表链表结构体123456789typedef int DataType;//双向循环链表节点结构体声明typedef struct Node{ DataType data;//数据域 struct Node *prev;//指针域 struct Node *next;}linknode;
1、初始化链表1234567891011// 初始化链表linknode *init_list(void){ linknode *head = malloc(sizeof(linknode)); if(head == NULL) return NULL; head->next = head; head->prev = head; return head;}
2、创建一个节点123456789101112// 创建一个节点linknode *create_node(DataType data){ linknode *new = malloc(sizeof(linknode)); if(new == NULL) return ...
05内核链表
五、内核链表1、使用方法链表结构体12345678typedef int DataType;//双向循环链表节点结构体声明typedef struct Node{ DataType data; struct list_head list;}linknode;
1、初始化链表12345678910// 初始化链表linknode *init_list(void){ linknode *head = malloc(sizeof(linknode)); if(head == NULL) return NULL; INIT_LIST_HEAD(&head->list); return head;}
2、创建节点123456789101112// 创建节点linknode *create_node(DataType data){ linknode *new = malloc(sizeof(linknode)); if(new == NULL) return NULL; INIT_LIST_HEAD(&new-> ...
06顺序栈
一、顺序栈栈结构体12345678910typedef int Datatype;//顺序栈的管理结构体声明typedef struct Sequent_stack{ Datatype *stack;//表示栈结构的空间起始地址 int size;//栈的大小,最多能放元素的个数 int top;//栈顶偏移}seqStack;
1、栈初始化123456789101112131415161718// 栈初始化seqStack *init_stack(int size){ seqStack *s = malloc(sizeof(seqStack)); if(s != NULL) { s->stack = malloc(sizeof(Datatype) * size); if(s->stack == NULL) { free(s); return NULL; } s->size = size; s->top = -1; } return s;}
2、判断栈满1234 ...
07链式栈
一、链式栈链式栈管理结构体12345678910111213141516typedef int Datatype;//链式栈节点struct Node{ Datatype data; struct Node *next;};// 链式栈管理结构体typedef struct link_stack{ int size; //元素个数 struct Node *top; //栈顶}linkStack;
1、初始化栈123456789101112// 初始化栈linkStack *init_stack(void){ linkStack *s = malloc(sizeof(linkStack)); if(s != NULL) { s->size = 0; s->top = NULL; } return s;}
2、判断栈空123456// 判断栈空bool is_empty(linkStack *s){ // return s->top == NULL; return s-> ...