TLPI-Chapter 44 管道和FIFO

管道由pipe函数创建,提供一个单向数据流。pipe函数返回两个文件描述符:fd[0]与fd[1],前者打开来读,后者打开来写。

管道的典型用途是在父子进程之前提供进程间通信手段。首先,由父进程创建一个管道,然后调用fork创建子进程。如果父进程关闭管道的读出端,子进程关闭管道的写入端。在父子进程间就形成了一个单向数据流。

通常我们在shell中输入一个像下面的命令时:

cmd1 | cmd2 | cmd3

将会创建三个进程和其中的两个管道。将每个进程的读出端复制到相应进程的标准输入,把每个管道的写入端复制到相应进程的标准输出。

#include <unistd.h>......

制作ubuntu19.04 U盘启动盘

收拾东西发现了7 8年之前用过的一款渣渣windows笔记本,使用windows系统的话发现已经卡到怀疑人生,因此本文记录使用mac制作linux U盘启动盘,然后安装centos7的全部过程。

Windows制作U盘启动盘存在很多成熟的工具比如UltralISO deepin等等,mac下无需使用工具,直接使用dd命令,详细操作步骤如下.

Mac下将ISO写入U盘可使用命令行工具dd,操作如下:

1.找出U盘挂载的路径,使用如下命令:diskutil list

bogon:~ coder52$ diskutil list

/dev/disk0 (internal, phys......

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......

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同样可以得到正确输出......

TLPI-Chapter 55 文件加锁

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

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

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

使用flock()给文件加锁

函数原型:

#include <sys/file.h>

int flock(int fd,int operation);

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

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中存在将大端模式转换为小端模式的方法,该方法不会被直接调用......