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中对其进行访问;如果线程被......

The Linux Programming Interface

本文复习The Linux Programming Interface一书中,一些知识点的总结,源代码存在github中,在源代码中添加部分注释,用于学习与总结。

确定glibc版本

使用如下命令:

[root@centos7-10 files]# ldd /usr/bin/ls | grep libc

libcap.so.2 => /lib64/libcap.so.2 (0x00007f7d5a0c1000)

libc.so.6 => /lib64/libc.so.6 (0x00007f7d59aeb000)

然后在shell窗口中执行如下命令可以看到:

......

TLPI-Chapter 30 线程:线程同步

互斥量/*************************************************************************\

* Copyright (C) Michael Kerrisk, 2017. *

* *

* This program is free software. You may use, modify, and redistribut......

TLPI-Chapter 26 监控子进程

/*************************************************************************\

* Copyright (C) Michael Kerrisk, 2017. *

* *

* This program is free software. You may use, modify, and redistribute i......

TLPI-Chapter 25 进程的终止

#define _BSD_SOURCE /* Get on_exit() declaration from <stdlib.h> */

#include <stdlib.h>

#include "tlpi_hdr.h"

static void

atexitFunc1(void)

{

printf("atexit function 1 called\n");

}

static void

atexitFunc2(void)

{

printf("atexit function 2 called\n");

......

TLPI-Chapter 24 进程的创建

/*************************************************************************\

* Copyright (C) Michael Kerrisk, 2017. *

* *

* This program is free software. You may use, modify, and redistribute i......

TLPI-Chapter 29线程介绍

#include <pthread.h>

#include <unistd.h>

#include <stdio.h>

#include <stdlib.h>

void printids(const char *s)

{

pid_t pid;

pthread_t tid;

/*getpid获取当前进程的ID*/

pid = getpid();

/*pthread_self获取自己的线程ID*/

tid = pthread_self();

printf("%s pid = %lu tid = %lu\n", s, (un......

TLPI-Chapter 20 信号

基本概念

信号是事件发生时对进程的通知机制。有时也称为软件中断,信号与硬件中断相似之处在于打断了程序执行的正常流程,大多数情况下,无法预测信号到达的精确时间。

一个具有合适权限的进程能够向另一进程发送信号,信号的这一用法可作为一种同步技术,甚至是进程通信IPC的原始形式。进程也可以向自身发送信号。然而发往进程的诸多信号,通常都是源于内核。

引发内核为进程产生信号的各类事件如下:

硬件发生异常:硬件异常的例子包括执行一条异常的机器语言指令,如被0除,或者引用了无法访问的内存区域。

用户键入能够产生信号的中断特殊字符:包括中断字符(Control-C)

发生了软件事件:例如......

TLPI-Chapter 13文件I/O缓冲

函数:void *memalign(size_t alignment, size_t size);

The obsolete function memalign() allocates size bytes and returns a pointer to the allocated memory. The memory address will be a multiple of alignment, which must be a power of two.

memalign 分配 size 字节的空间,返回指向该空间的指针,空间的地址是 alignment 的倍数,alig......