Mac使用技巧

使用macOS的第5个年头,依然菜的抠脚,记录一些从现在开始所掌握的小技巧,提高日常使用效率。

如何在终端中打开finder

在终端里打开Finder很简单,使用open .即可。

在finder中打开终端

进入系统偏好设置->键盘->快捷键->服务。

在右边新建位于文件夹位置的终端窗口上打勾。

如此设置后,在Finder中右击某文件,在出现的菜单中找到服务,然后点击新建位于文件夹位置的终端窗口即可。

TLPI-Chapter 42 共享库高级特性

动态加载库

核心dlopen API由以下函数(所有这些函数都在SUSv3进行了规定)构成。

dlopen()函数打开一个共享库,返回一个供后续调用使用的句柄。

dlsym()函数在库中搜索一个符号并返回其地址。

dlclose()函数关闭之前由dlopen()打开的库。

dlerror()函数返回一个错误消息字符串,在调用上述函数中的某个函数发生错误时可以使用这个函数来获取错误消息。

dlopen函数

dlopen函数将名libfilename的共享库加载进调用进程的虚拟地址空间并增加该库的打开引用计数。

#include <dlfcn.h>

void *d......

TLPI-Chapter 41 共享库基础

题外话:在编译程序时包含调试信息

使用gcc/cc编译时指定-g选项可以使得程序中包含调试信息,所带来的影响是可执行文件的体积增大。

如果使用strip(1)命令: strip - Discard symbols from object files,可以从可执行文件和库文件中删除调试信息。

#include <stdio.h>

int sum(int a,int b)

{

return a + b;

}

int g_count = 0;

int main()

{

printf("Hello world.\n");

return 0;

}

[......

readlink

readlink既是一个linux下的命令,又是Linux系统编程中的一个函数,因此本文分两部分介绍readlink.

readlink命令

readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置。

在Ubuntu系统中执行以下命令:

$ readlink --help

可以查看readlink命令的帮助信息,或者执行

$ man readlink

查看帮助手册。

从帮助信息中可以得到readlink命令的用途描述:

输出符号链接值或者权威文件名

英文为:

print value of a symbol......

cJSON使用入门

本文例子及相关解释来自文章cJSON的使用方法,修复原文中的几个明显错误和内存泄露,因在项目中需要使用到cJSON,因此本文主要学习cJSON的相关使用,源码阅读与解析在后续文章中更新。

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScrip......

TLPI-Chapter 55 文件加锁

应用程序的一个常见需求是从一个文件中读取一些数据,然后将这些数据写回文件。只要在一个时刻只有一个进程以这种方式使用文件就不会存在问题,但当多个进程同时更新一个文件时问题就出现了。本文将介绍两组不同的给文件加锁的API。

flock()函数对整个文件加锁

fcntl()对一个文件的部分区域加锁

使用flock()给文件加锁

函数原型:

#include <sys/file.h>

int flock(int fd,int operation);

fcntl()函数提供了比该函数更为强大的功能,并且所拥有的功能也覆盖了flock()所拥有的功能,但是在某些应用中任然......

Where is PATH_MAX defined in linux

stackoverflow上看到一篇帖子Where is PATH_MAX defined in linux,根据自己的理解总结如下:

源代码path_max.c

#include <stdio.h>

#include <linux/limits.h>

int main()

{

printf("%d\n",PATH_MAX);

return 0;

}

使用gcc -E path_max.c -o path_max.i,查案path_max.i,如果源代码中包含头文件limits.h而不是linux/limits.h同样可以得到正确输出......

pthread_join和pthread_detach

关于pthread_join

函数原形:

#include <pthread.h>

int pthread_join(pthread_t thread,void **retval);

return 0 on success,or a positive error number on error

调用pthread_join的线程会阻塞,如果线程已经终止,pthread_join会立即返回。

如果线程简单的返回,那么rval_ptr被设置成线程的返回值;如果调用了pthread_exit,则可将一个无类型指针返回,在pthread_join中对其进行访问;如果线程被......

redis中的字节序

在网络上传输数据时,由于数据传输的两端可能对应不同的硬件平台,采用的存储字节顺序也可能不一致,因此 TCP/IP 协议规定了在网络上必须采用网络字节顺序(大端模式) 。

通过对大小端的存储原理分析可发现,对于 char 型数据,由于其只占一个字节,所以不存在这个问题,这也是一般情况下把数据缓冲区定义成 char 类型 的原因之一。对于 IP 地址、端口号等非 char 型数据,必须在数据发送到网络上之前将其转换成大端模式,在接收到数据之后再将其转换成符合接收端主机的存储模式。

在redis3.0源代码中endianconv.c中存在将大端模式转换为小端模式的方法,该方法不会被直接调用......

符合&继承关系下的构造和析构

继承关系下构造析构顺序#include<iostream>

using namespace std;

class Base

{

public:

Base(){

cout << "Base ctor ..." << endl;

}

virtual ~Base(){

cout << "Base dtor ..." << endl;

}

};

class Derived:public Base

{

public:

Derived(){

cout << "Derived cto......