提交 bc272361 编写于 作者: W wizardforcel

2019-07-14 12:49:13

上级 3902da8f
+ [UIUC CS241 系统编程中文讲义](README.md)
+ [0\. 简介](docs/1.md)
+ [#Informal词汇表](docs/3.md)
+ [#Informal 词汇表](docs/3.md)
+ [#Piazza:何时以及如何寻求帮助](docs/4.md)
+ [编程技巧,第1部分](docs/5.md)
+ [编程技巧,第 1 部分](docs/5.md)
+ [系统编程短篇小说和歌曲](docs/6.md)
+ [1.学习C](docs/7.md)
+ [C编程,第1部分:简介](docs/8.md)
+ [C编程,第2部分:文本输入和输出](docs/9.md)
+ [C编程,第3部分:常见问题](docs/10.md)
+ [C编程,第4部分:字符串和结构](docs/11.md)
+ [C编程,第5部分:调试](docs/12.md)
+ [C编程,复习题](docs/13.md)
+ [1.学习 C](docs/7.md)
+ [C 编程,第 1 部分:简介](docs/8.md)
+ [C 编程,第 2 部分:文本输入和输出](docs/9.md)
+ [C 编程,第 3 部分:常见问题](docs/10.md)
+ [C 编程,第 4 部分:字符串和结构](docs/11.md)
+ [C 编程,第 5 部分:调试](docs/12.md)
+ [C 编程,复习题](docs/13.md)
+ [2.进程](docs/14.md)
+ [进程,第1部分:简介](docs/15.md)
+ [分叉,第1部分:简介](docs/16.md)
+ [分叉,第2部分:Fork,Exec,等等](docs/17.md)
+ [进程控制,第1部分:使用信号等待宏](docs/18.md)
+ [进程,第 1 部分:简介](docs/15.md)
+ [分叉,第 1 部分:简介](docs/16.md)
+ [分叉,第 2 部分:Fork,Exec,等等](docs/17.md)
+ [进程控制,第 1 部分:使用信号等待宏](docs/18.md)
+ [进程复习题](docs/19.md)
+ [3.内存和分配器](docs/20.md)
+ [内存,第1部分:堆内存简介](docs/21.md)
+ [内存,第2部分:实现内存分配器](docs/22.md)
+ [内存,第3部分:粉碎堆栈示例](docs/23.md)
+ [内存,第 1 部分:堆内存简介](docs/21.md)
+ [内存,第 2 部分:实现内存分配器](docs/22.md)
+ [内存,第 3 部分:粉碎堆栈示例](docs/23.md)
+ [内存复习题](docs/24.md)
+ [4.介绍Pthreads](docs/25.md)
+ [Pthreads,第1部分:简介](docs/26.md)
+ [Pthreads,第2部分:实践中的用法](docs/27.md)
+ [Pthreads,第3部分:并行问题(奖金)](docs/28.md)
+ [Pthread复习题](docs/29.md)
+ [4.介绍 Pthreads](docs/25.md)
+ [Pthreads,第 1 部分:简介](docs/26.md)
+ [Pthreads,第 2 部分:实践中的用法](docs/27.md)
+ [Pthreads,第 3 部分:并行问题(奖金)](docs/28.md)
+ [Pthread 复习题](docs/29.md)
+ [5.同步](docs/30.md)
+ [同步,第1部分:互斥锁](docs/31.md)
+ [同步,第2部分:计算信号量](docs/32.md)
+ [同步,第3部分:使用互斥锁和信号量](docs/33.md)
+ [同步,第4部分:临界区问题](docs/34.md)
+ [同步,第5部分:条件变量](docs/35.md)
+ [同步,第6部分:实现障碍](docs/36.md)
+ [同步,第7部分:读者编写器问题](docs/37.md)
+ [同步,第8部分:环形缓冲区示例](docs/38.md)
+ [同步,第 1 部分:互斥锁](docs/31.md)
+ [同步,第 2 部分:计算信号量](docs/32.md)
+ [同步,第 3 部分:使用互斥锁和信号量](docs/33.md)
+ [同步,第 4 部分:临界区问题](docs/34.md)
+ [同步,第 5 部分:条件变量](docs/35.md)
+ [同步,第 6 部分:实现障碍](docs/36.md)
+ [同步,第 7 部分:读者编写器问题](docs/37.md)
+ [同步,第 8 部分:环形缓冲区示例](docs/38.md)
+ [同步复习题](docs/39.md)
+ [6.死锁](docs/40.md)
+ [死锁,第1部分:资源分配图](docs/41.md)
+ [死锁,第2部分:死锁条件](docs/42.md)
+ [死锁,第3部分:餐饮哲学家](docs/43.md)
+ [死锁,第 1 部分:资源分配图](docs/41.md)
+ [死锁,第 2 部分:死锁条件](docs/42.md)
+ [死锁,第 3 部分:餐饮哲学家](docs/43.md)
+ [死锁复习题](docs/44.md)
+ [7.进程间通信&调度](docs/45.md)
+ [虚拟内存,第1部分:虚拟内存简介](docs/46.md)
+ [管道,第1部分:管道介绍](docs/47.md)
+ [管道,第2部分:管道编程秘密](docs/48.md)
+ [文件,第1部分:使用文件](docs/49.md)
+ [调度,第1部分:调度过程](docs/50.md)
+ [调度,第2部分:调度过程:算法](docs/51.md)
+ [IPC复习题](docs/52.md)
+ [虚拟内存,第 1 部分:虚拟内存简介](docs/46.md)
+ [管道,第 1 部分:管道介绍](docs/47.md)
+ [管道,第 2 部分:管道编程秘密](docs/48.md)
+ [文件,第 1 部分:使用文件](docs/49.md)
+ [调度,第 1 部分:调度过程](docs/50.md)
+ [调度,第 2 部分:调度过程:算法](docs/51.md)
+ [IPC 复习题](docs/52.md)
+ [8.网络](docs/53.md)
+ [POSIX,第1部分:错误处理](docs/54.md)
+ [网络,第1部分:简介](docs/55.md)
+ [网络,第2部分:使用getaddrinfo](docs/56.md)
+ [网络,第3部分:构建一个简单的TCP客户端](docs/57.md)
+ [网络,第4部分:构建一个简单的TCP服务器](docs/58.md)
+ [网络,第5部分:关闭端口,重用端口和其他技巧](docs/59.md)
+ [网络,第6部分:创建UDP服务器](docs/60.md)
+ [网络,第7部分:非阻塞I O,select()和epoll](docs/61.md)
+ [RPC,第1部分:远程过程调用简介](docs/62.md)
+ [POSIX,第 1 部分:错误处理](docs/54.md)
+ [网络,第 1 部分:简介](docs/55.md)
+ [网络,第 2 部分:使用 getaddrinfo](docs/56.md)
+ [网络,第 3 部分:构建一个简单的 TCP 客户端](docs/57.md)
+ [网络,第 4 部分:构建一个简单的 TCP 服务器](docs/58.md)
+ [网络,第 5 部分:关闭端口,重用端口和其他技巧](docs/59.md)
+ [网络,第 6 部分:创建 UDP 服务器](docs/60.md)
+ [网络,第 7 部分:非阻塞 I O,select()和 epoll](docs/61.md)
+ [RPC,第 1 部分:远程过程调用简介](docs/62.md)
+ [网络复习题](docs/63.md)
+ [9.文件系统](docs/64.md)
+ [文件系统,第1部分:简介](docs/65.md)
+ [文件系统,第2部分:文件是inode(其他一切只是数据...)](docs/66.md)
+ [文件系统,第3部分:权限](docs/67.md)
+ [文件系统,第4部分:使用目录](docs/68.md)
+ [文件系统,第5部分:虚拟文件系统](docs/69.md)
+ [文件系统,第6部分:内存映射文件和共享内存](docs/70.md)
+ [文件系统,第7部分:可扩展且可靠的文件系统](docs/71.md)
+ [文件系统,第8部分:从Android设备中删除预装的恶意软件](docs/72.md)
+ [文件系统,第9部分:磁盘块示例](docs/73.md)
+ [文件系统,第 1 部分:简介](docs/65.md)
+ [文件系统,第 2 部分:文件是 inode(其他一切只是数据...)](docs/66.md)
+ [文件系统,第 3 部分:权限](docs/67.md)
+ [文件系统,第 4 部分:使用目录](docs/68.md)
+ [文件系统,第 5 部分:虚拟文件系统](docs/69.md)
+ [文件系统,第 6 部分:内存映射文件和共享内存](docs/70.md)
+ [文件系统,第 7 部分:可扩展且可靠的文件系统](docs/71.md)
+ [文件系统,第 8 部分:从 Android 设备中删除预装的恶意软件](docs/72.md)
+ [文件系统,第 9 部分:磁盘块示例](docs/73.md)
+ [文件系统复习题](docs/74.md)
+ [10.信号](docs/75.md)
+ [过程控制,第1部分:使用信号等待宏](docs/76.md)
+ [信号,第2部分:待处理的信号和信号掩码](docs/77.md)
+ [信号,第3部分:提高信号](docs/78.md)
+ [信号,第4部分:信号](docs/79.md)
+ [过程控制,第 1 部分:使用信号等待宏](docs/76.md)
+ [信号,第 2 部分:待处理的信号和信号掩码](docs/77.md)
+ [信号,第 3 部分:提高信号](docs/78.md)
+ [信号,第 4 部分:信号](docs/79.md)
+ [信号复习题](docs/80.md)
+ [考试练习题](docs/81.md)
+ [考试主题](docs/82.md)
+ [C编程:复习题](docs/83.md)
+ [C 编程:复习题](docs/83.md)
+ [多线程编程:复习题](docs/84.md)
+ [同步概念:复习题](docs/85.md)
+ [记忆:复习题](docs/86.md)
......
......@@ -12,8 +12,8 @@
## 外部资源
* [在 Y 分钟中学习 X](https://learnxinyminutes.com/docs/c/) (强烈推荐浏览!)
* [面向C ++ / Java 程序员的 C](http://www.ccs.neu.edu/course/com3620/parent/C-for-Java-C++/c-for-c++-alt.html)
* [Brian KernighanC 教程](http://www.lysator.liu.se/c/bwk-tutor.html)
* [面向 C ++ / Java 程序员的 C](http://www.ccs.neu.edu/course/com3620/parent/C-for-Java-C++/c-for-c++-alt.html)
* [Brian KernighanC 教程](http://www.lysator.liu.se/c/bwk-tutor.html)
* [c faq](http://c-faq.com/)
* [C 训练营](http://gribblelab.org/CBootCamp/index.html)
* [C / C ++函数参考](http://www.cplusplus.com/reference/clibrary/)
......@@ -22,7 +22,7 @@
## C 速成教程介绍
__新页面警告__ 请为我修复拼写错误和格式错误,并添加有用的链接。*
__ 新页面警告 __ 请为我修复拼写错误和格式错误,并添加有用的链接。*
### 你怎么用 C 写一个完整的 hello world 程序?
......@@ -136,7 +136,7 @@ char *string = give_me_space;
gcc 和 clang 不符合 ISO-C 标准,这意味着它们可以让你对 void 指针进行算术运算。他们会将它视为 char 指针,但不要这样做,因为它可能不适用于所有编译器!
### `printf`调用 write 或write 调用`printf`?
### `printf`调用 write 或 write 调用`printf`?
`printf`调用`write``printf`包含一个内部缓冲区,因此,为了提高性能`printf`每次调用`printf`时都不会调用`write``printf`是 C 库函数。 `write`是系统调用,我们知道系统调用很昂贵。另一方面,`printf`使用的缓冲区在这一点上更适合我们的需求
......@@ -315,7 +315,7 @@ void mystrcpy(char*dest, char* src) {
while( (*dest++ = *src++ )) {};
```
### 你怎么写 strdup的替换?
### 你怎么写 strdup 的替换?
```c
// Use strlen+1 to find the zero byte...
......@@ -328,7 +328,7 @@ char* mystrdup(char*source) {
### 你如何在堆上取消分配内存?
使用free!
使用 free!
```c
int *n = (int *) malloc(sizeof(int));
......@@ -360,7 +360,7 @@ p = NULL; // Now you can't use this pointer by mistake
### 什么是缓冲区溢出的例子?
着名的例子:Heart Bleed(在一个大小不足的缓冲区中执行 memcpy)。简单的例子:在确定所需内存的大小时,实现 strcpy 并忘记添加一个strlen。
着名的例子:Heart Bleed(在一个大小不足的缓冲区中执行 memcpy)。简单的例子:在确定所需内存的大小时,实现 strcpy 并忘记添加一个 strlen。
### 什么是'typedef',你如何使用它?
......@@ -390,6 +390,6 @@ comparator gt = greater_than;
这声明了一个函数类型比较器,它接受两个`void*`参数并返回一个 int。
### 哇 C好多啊
### 哇 C 好多啊
不要再担心了!
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册