《Linux系统编程的学习笔记》是一份详细的记录文档,涵盖了从基础概念到复杂应用的各种知识点和实践案例,旨在帮助读者深入理解并掌握Linux环境下的编程技术。
Linux系统编程是指在Linux操作系统上进行程序开发的一种形式。它涵盖了多个方面,包括文件操作、进程管理、内存管理和网络编程。
这种编程方式覆盖了许多领域,从基础的文件处理到高级的网络通信和多线程编程,为开发者提供了广泛的功能与灵活性。从事这一领域的程序员需要深入理解Linux内核以及系统的底层工作原理。
具体而言,在Linux系统上进行程序开发通常涉及与操作系统核心直接交互以实现各种功能,如文件操作、进程管理及网络通信等。这类编程活动往往需调用系统函数,并使用C或C++这样的低级语言编写代码。
### Linux 系统编程学习笔记
#### 一、IO(输入输出)
**1.1 标准 IO**
- **fopenfclose**: `fopen` 函数用于打开或者创建一个文件并返回指向该文件的指针,而 `fclose` 则关闭已经打开的文件。需要注意的是,模式参数决定了操作方式;例如,“r”表示只读,“w”则为写入。
```c
FILE *fopen(const char *path, const char *mode);
int fclose(FILE *fp);
```
- **fgetcfputcfgetsfputs**: 这些函数用于从文件中读取和写入字符或字符串。`fgetc` 和 `fputc` 处理单个字符,而 `fgets` 和 `fputs` 则处理整行文本。
```c
int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
char *fgets(char *s, int n, FILE *stream);
int fputs(const char *s, FILE *stream);
```
- **freadfwrite**: 用于读取和写入固定大小的数据块,适合处理二进制文件或大量数据。
```c
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
```
- **printfscanfatoisprintf**: 用于格式化输入输出,`atoi` 将字符串转换为整数。
```c
int printf(const char *format, ...);
int scanf(const char *format, ...);
int atoi(const char *nptr);
```
- **fseekftellrewindfflush**: 控制文件指针位置的函数。例如 `fseek` 移动到指定位置,而 `ftell` 返回当前的位置。
```c
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
void rewind(FILE *stream);
```
- **getlinemygetline**: 用于从文件中读取一行文本。其中 `getline` 是一个非标准函数,但广泛使用。
**2.1 文件描述符实现原理**
- 文件描述符是操作系统用来标识打开的文件的一个数字(非负整数),在Linux系统下通常是从0开始递增的。
**2.2 文件描述符操作**
```c
int open(const char *pathname, int flags);
int close(int fd);
```
- **readwritelseek**: 用于读写文件以及改变指针位置。
#### 二、文件系统
**1.1 文件属性**
- `stat` 获取文件的状态信息,包括大小和权限。
```c
int stat(const char *path, struct stat *buf);
```
**2.4 同步**
```c
int sync(void);
int fcntl(int fd, int cmd, ...);
int ioctl(int fd, unsigned int request, ...);
```
#### 三、进程环境
**3.1 进程的终止方式**
- `exit`, `_exit` 等函数用于结束一个程序。
```c
void exit(int status);
void _exit(int status);
```
#### 四、进程基础
**2. 子父进程生成**
```c
pid_t fork(void);
```
**3. 资源回收**
- `waitpid` 用来等待子进程结束。
```c
pid_t waitpid(pid_t pid, int *status, int options);
```
#### 五、并发(信号和线程)
**1. 信号**
```c
void (*signal(int signum, void (*handler)(int)))(int);
```
- **可重入的函数响应过程**
- 多任务计时器 `setitimer` 设置定时器。
```c
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
```
**2. 线程**
```c
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
```
- **线程终止和栈清理**
#### 六、