
【C】
_HelloBug
这个作者很懒,什么都没留下…
展开
-
Lua源码-C语言技巧-字节对齐
一、目标字节对齐长度和系统中数据类型的最大字节长度相等。二、Lua源码实现方式定义联合体,LUAI_USER_ALIGNMENT_T 的字节长度为联合体中字段字节长度最大的。即double、void *、long中最大的字节长度。typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;#define LUAI_USER_ALIGNMENT_T union{ double u; void *s; long l; }定义其他结构体类型时,使用联合体的方式定义,其中包含字原创 2021-07-10 12:34:23 · 482 阅读 · 0 评论 -
APUE-分页读取文件
#include "ourhdir.h"#include <sys/wait.h> // waitpid#include <sys/types.h> // pid_t#define DFL_PAGER "/usr/bin/more" // 默认的分页命令int main(int argc, char *argv[]) { int fd[2]; // 使用全双工管道,父进程写入写端,原创 2018-03-03 18:49:34 · 254 阅读 · 1 评论 -
APUE-FIFO理解
1.FIFO是一种文件类型。struct stat结构体中st_mode字段指明该文件是否是FIFO类型。可使用宏S_ISFIFO进行测试。2.FIFO操作函数:mkfifo, open, read, write, close, unlink等对文件进行操作的函数。 注:打开FIFO时同其他文件一样可以指定打开标识(如非阻塞,默认是阻塞打开),以及文件访问权限。3.阻塞打开FIFO:只读打开阻塞...原创 2018-03-12 20:01:07 · 213 阅读 · 0 评论 -
VS编译错误:winsock.h winsock2.h ws2def.h 重定义
1.查找winsock.h winsock2.h windows.h调用的地方 2.确保windows.h包含的地方同时包含winsock2.h(先包含winsock2.h) 如:#include <WinSock2.h>#include <windows.h>3.将包含winsock.h的地方修改为包含winsock2.h...原创 2018-03-06 13:18:22 · 3666 阅读 · 0 评论 -
APUE-从SystemV IPC可以学到的设计思路
1. 既然消息队列、信号量、共享内存都有控制数据(结构体),提供一个控制函数对该控制数据进行读写,并且通过一个参数int cmd来决定对该控制数据执行什么控制操作,而且不同的cmd可以有返回值,可以无返回值。增加函数的灵活度。2. 根据函数的参数,决定是创建一个新的还是打开一个既存的。可以避免把函数写死或写两个函数:创建函数和打开函数。3. 函数执行的过程,通过设置类似errno的值,解释发生了什...原创 2018-03-19 18:55:31 · 134 阅读 · 0 评论 -
进程ID
1.进程的ID如下:实际用户ID 实际组ID 在登录时输入的用户及该用户所在的组。即口令文件中的登录项有效用户ID 有效组ID添加组ID 决定文件的访问权限。即这三个ID和文件的所有者/组ID的顺序匹配关系。 新文件的所有者ID设置为有效用户ID,所有者所在的组ID设置为进程的有效组ID/新文件所在目录的组ID。保存设置-用户ID保存设置-组ID2. 改变三个用户ID的方法(适用于组I...原创 2018-03-19 19:42:29 · 684 阅读 · 0 评论 -
结构体定义:unsigned int type : 2;
1. C语言实现的HTTP协议的解析源码中有下面的结构体定义:struct http_parser { unsigned int type : 2; unsigned int flags : 8; unsigned int state : 7; unsigned int header_state : 7; unsigned int index : 7;...原创 2018-10-25 18:42:09 · 2664 阅读 · 0 评论 -
__builtin_expect 作用
1. 在http-parser源码中看到下面实现:#ifdef __GNUC__# define LIKELY(X) __builtin_expect(!!(X), 1)# define UNLIKELY(X) __builtin_expect(!!(X), 0)#else# define LIKELY(X) (X)# define UNLIKELY(X) (X)#endif...原创 2018-10-25 18:58:58 · 1208 阅读 · 0 评论 -
extern C和__cplusplus的使用
1. C语言文件中有如下形式代码:#ifdef __cplusplusextern "C" {#endif/**** some declaration or so *****/#ifdef __cplusplus }#endif 2. 理解这种形式的声明表明如果该文件被C++程序调用,使用C语言的语法形式编译。如果是C++程序,C++的编译器如g++ 定义了...原创 2018-10-25 22:12:07 · 683 阅读 · 0 评论 -
结构体声明和定义
1. 声明一个命名结构体struct student { int age; char name[128];}; 定义一个变量:struct student Lily; 给结构体起别名:typedef struct student STUDENT_t;2. 声明一个命名结构体并定义一个变量struct student { int ag...原创 2018-10-25 22:29:29 · 7553 阅读 · 0 评论 -
C 预编译、编译、汇编、链接简单实例
目录1.创建test.c文件2.预编译3.编译4.汇编5.链接6.错误运行7.错误解决8.正常运行1.创建源文件test.c#include <stdio.h>#define NUM 100int main() { // test this file printf("%s\n", "hello, world")...原创 2019-07-16 18:41:16 · 241 阅读 · 0 评论 -
APUE-错误处理函数
#include <errno.h> // errno#include <stdarg.h> // 标准C头文件,可变参数#include "ourhdir.h" // 自定义的头文件// static:表示该函数只能在该文件中使用// va_list的指针类型其实是char *// 函数声明中使用static,函数实现的函数头中要表里如一static void err_doit(int,原创 2018-03-03 18:48:12 · 196 阅读 · 0 评论 -
APUE-通过管道同步父子进程
#include "ourhdir.h"#include <sys/types.h> // pid_t// fd1[2] 父进程读,子进程写// fd2[2] 父进程写,子进程读static int fd1[2], fd2[2];// TELL_WAIT函数是在未创建子进程的时候调用的// 子进程创建之后,父子进程都有fd1 fd2void TELL_WAIT(void) { if原创 2018-03-03 18:41:55 · 250 阅读 · 0 评论 -
可变参数
宏和函数原型和使用用例原创 2017-11-06 18:05:24 · 196 阅读 · 0 评论 -
生成随机数
通过rand/srand函数和通过/dev/urandom文件产生随机数原创 2017-11-08 19:05:19 · 378 阅读 · 0 评论 -
网络字节序转化
网络字节序的转化中的函数原型和简单使用原创 2017-11-09 18:30:17 · 328 阅读 · 0 评论 -
守护进程
守护进程:运行在后台周期性的执行某种任务或者等待处理某些发生的事 父进程是init进程,因为一开始的父进程在fork执行之后就退出了,所以他是被init进程领养的孤儿进程。守护进程没有控制终端。守护进程的名称通常以d(deamon)结尾进程、进程组、会话、控制终端:进程组由若干个进程组成。会话由若干个进程组组成。默认情况下,新进程继承父进程的进程组ID原创 2017-11-20 17:54:06 · 272 阅读 · 0 评论 -
Linux创建线程的属性设置
如果线程调用函数:sleep()函数,就是挂起自己,线程挂起,此时CPU的时间片就会分配给其他进程。而如果当前线程自己轮询操作,就会一直使用系统分配给自己的时间片。对于一个系统而言:系统会分配给线程时间片,同时系统执行调度程序也会花费时间,称为调度时间。创建线程时的属性设置1. 线程的调度策略:SCHED_OTHREAD 非实时调度策略。线程优先级为0,每个线程都不抢占其他原创 2017-11-20 17:49:09 · 1113 阅读 · 0 评论 -
C文件中debug函数及宏中##的使用
1.redis-3.0\src\redis.h#define redisDebug(fmt, ...) \ printf("DEBUG %s:%d > " fmt "\n", __FILE__, __LINE__, __VA_ARGS__)#define redisDebugMark() \ printf("-- MARK %s:%d --\n", __FILE__, __...原创 2018-03-09 18:43:36 · 3132 阅读 · 0 评论 -
C 标准头文件和非标准头文件
标准头文件:使用<>包含的头文件 先到/usr/include里去寻找该头文件,找不到的话到当前目录非标准头文件:使用""包含的头文件 直接到当前目录找该头文件在源文件中包含的头文件如果在/usr/include和当前目录找不到话,编译就会出错,找不到该头文件。所有的标准头文件都放在目录:/usr/include非标准头文件可以放在目录:/usr/local/include,但...原创 2018-03-02 17:05:04 · 2733 阅读 · 0 评论 -
gcc 编译选型-l-I-L
-I 指定头文件目录-L 指定寻找库文件的目录-l 指定动态链接库文件(是文件不是目录)动态链接库文件:.so-static 指定静态链接库文件 静态链接库文件:.a例如:使用gcc编译时使用的编译选项-levent 没有指定该链接库文件的类型,通过-l来指示是引用该文件的动态连接库...原创 2018-03-02 17:07:49 · 504 阅读 · 0 评论 -
#define # ##使用
一:可变参数使用:printf(fmt, ...)#define DPRINTF(fmt, args...) printf(fmt, ##args)args...表示fmt之后的参数可以是零个或者多个。二:#和##只能在宏定义中使用 #是把宏参数变为一个字符串,##是把两个宏参数连接在一起1. #include <stdio.h>#define ...原创 2018-03-02 17:16:16 · 3262 阅读 · 0 评论 -
网络编程 select
1. select多路复用:多路即多个socket,复用即select可以检查多个socket,然后根据select函数的返回值,对socket进行使用。#include <sys/time.h>#include <sys/types.h>#include <unistd.h>int select(int nfds, fd_set *readfds, fd...原创 2018-03-02 17:18:14 · 859 阅读 · 0 评论 -
time相关函数
相关结构体和函数使用原创 2017-11-07 17:36:52 · 372 阅读 · 0 评论