以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  Linux编程(ZT)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=27734)


--  作者:enorm
--  发布时间:2/24/2006 7:23:00 PM

--  Linux编程(ZT)
一。UNIX/Linux环境篇

Q:我想学Unix/Linux下的程序设计,该用什么语言?该看什么书?
A:应该首选C。无论是Unix自身,还是其上运行的软件,绝大部分都是用C写的。Unix操作系统的API(系统调用)接口也是以C函数的形式给出的。有两本书是必读的:《C程序设计语言》第二版,和《Unix环境高级编程》,这两本书含金量太高,推荐你买印刷版。


Q:“段错误”是什么原因?
A:程序运行中出现段错误(segmentation fault),是由于出现了内存违例访问,比方说,读或写一块没分配给你的内存,写具有只读属性的内存,等等。初学者容易犯这样的错误:

1 struct student {
2 int age;
3 char name[128];
4 int score;
5 };
6
7 struct student *p;
8 p->;age = 21;/*错误!student结构还没实例化、没分配空间呢*/

第7行应改为:
struct student a;
struct student *p = &


Q:我写了个Unix的小程序,可是编译报错,说函数未声明?
A:你应该 “man 函数名”,把手册中给出的头文件在程序中#include进去。


Q:我在Solaries/Aix/HP-UX/Irix/Tru64……上编写程序,为什么编译报错,说找不到函数定义?
A:你应该在编译时指定需要连接的库。例如,若程序中使用了标准C的数学库,则加上-lm;若使用了posix线程库,则加上-lpthread;若使用了socket函数,则加上-lsocket;若使用了posix实时扩展库,则加上-lrt;等等。
另外,Linux上的gcc编译时会自动寻找需要某些系统库,象在Linux上用gcc编译socket程序不用指定-lsocket也可以,但是遗憾的是:1)并非对所有的库都有效,如数学库就不会自动加上;2)并非所有Unix上的CC都提供这个特性。


Q:我编译程序,指定了连接某个库,可是不对啊?
A:如果你的头文件和库文件不在标准搜索路径中,要在编译时指定它们。

举例来说,我的mysql安装在/usr/local/mysql/下,头文件在/usr/local/mysql/include/mysql/下,库文件在/usr/local/mysql/lib/mysql/下,我要连接mysqlclient这个库,则编译选项是这样的:
CFLAGS = -Wall -g -I/usr/local/mysql/include/mysql -L/usr/local/mysql/lib/mysql -lmysqlclient

Q:我按照上面的格式编译程序,通过了,可运行时找不到共享库了?
A:上面这个例子,在生成的可执行文件中加入了库路径的信息,因此,如果你的库文件不在标准路径下,可以:1)把它复制到/usr/lib/下,如果该库非常常用;2)修改/etc/ld.so.conf文件,把库的全路径添加进去,运行ldconfig;3)export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:your-path,如果该库不太常用的话。

Q:我想学习Makefile的写法,怎么办?
A:本版精华区有《跟我一起写Makefile》,请参考。

Q:我想学习GDB,怎么办?
A:本版精华区有《使用GDB调试程序》,请参考。


二。Vi/Vim篇
(如无特别说明,称为Vim。另,只说明vimtutor中没讲到、但又比较实用的,细节请参考flw版主的置顶贴,和下面给出的中文手册)

Q:vi和vim有什么区别?
A:vi是VIsual的意思,是伴随着几乎是最初的Unix发行版的编辑器;vim是VI Improved的意思,即Vi的增强版。推荐用Vim。

Q:哪里能找到Vim的中文手册?
A:Vim用户手册:
http://vcd.gro.clinux.org/
Vim帮助手册:
http://vimcdoc.sf.net。

Q:vim中怎样上下左右移动光标?
A:请运行vimtutor,它会手把手教你如何使用vim的最基本功能。

Q:vim中如何进入man手册?
A:光标移动到函数名上,按大写的K,就会进入手册页。

Q:但是我把光标停留在printf上,按K,进入了bash的printf手册啊?
A:printf是C库函数,在手册页中属于第三部分。请先输入3,再按K。如果是系统调用(例如kill函数),先输入2再按K。

Q:我想知道某个系统定义的类型,比方说stat的真实定义,怎么做?
A:在vim中运行:ps stat,它会自动为你搜索该类型的真实定义。

Q:我想学习Vim的很多强大功能,怎么办?
A:参考flw版主的置顶贴,
http://bbs.chinaunix.net/forum/viewtopic.php?t=472608

三。好书推荐篇(若无特别说明,则是机械工业出版的)

4.1。C语言篇

Q:我是C语言的初学者,该看什么书?
A:推荐看谭浩强老师的《C程序设计教程》第二版。(清华大学出版社)

Q:我想进一步学习C语言,该看什么书?
A:K&R的《C程序设计语言》第二版是必读书。此外,推荐《程序设计实践》(机械工业有影印版)、《C语言接口与实现》、《C专家编程》(人民邮电)、《C:陷阱与缺陷》(人民邮电),以及从Stevens的著作中学习程序设计。

Q:我想成为C语言高手,该看什么书?
A:不好意思,我没资格回答这个问题。

4.2。数据结构与算法篇
Q:我数据结构与算法很菜,该看什么书?

A:推荐严蔚敏老师《数据结构与算法──C语言描述》第二版。(清华大学出版社)

Q:我想进一步学习数据结构与算法,该看什么书?
A:推荐Mark Allen Weiss的《数据结构与算法分析──C语言描述》第二版。

Q:我想掌握优秀程序员该掌握的所有数据结构与算法知识,该看什么书?
A:推荐Robert Sedgewick的《算法》第三版上下册,人民邮电出版。影印版《Algorithms in C》第三版上下册,中国电力出版。(说明:很惭愧,此书是根据牛人的推荐而来的,我还没看过几页)

4.3。Unix/Linux程序设计篇

Q:我想学习Unix/Linux下的程序设计,有专门讲这个的书吗?
A:Stevens的《Unix环境高级编程》是本领域无可替代的名著,请仔细阅读。(有影印版,也是机械工业出版)

Q:我想学习Unix/Linux的socket编程,看什么书?
A:Stevens的两卷《Unix网络编程》(第二版)是本领域无可替代的名著,请仔细阅读。都是清华大学出版社出版(都有影印版,卷二也是清华出版;其中卷一是第三版,机械工业出版,更详尽)

4.4。C++篇

Q:C++有哪些经典好书?
A:这个问题太大了,请参考whyglinux大侠的精华帖子:
http://bbs.chinaunix.net/forum/viewtopic.php?t=321401

四。C++篇

Q:为什么我的Hello World程序都报错?
A:请用g++命令编译C++程序,用gcc命令编译C程序──它们在最后确定需要连接的库时有所不同。

Q:我写了小程序,为什么报错说“cout未定义”?
A:请在程序中所有的include之后,加上using namespace std;另外,建议看一些“标准C++”的资料。

Q:我在VC下的程序编译报错,怎么回事?
A:不知道怎么回事。VC高版本不知道,VC6的作为开发框架的MFC和ATL不知道,但我知道VC6的编译器很垃圾。如果你一定要在Windows下学习C++,推荐用Dev-C++。

Q:我用Dev-C++编译程序,可是运行时一闪就过去了,怎样让屏幕停住?
A:在主函数返回前加上一句system(“pause”);或者cin.get();。

五。杂项篇

Q:我该学习Java还是C++?
A:不知道。

Q:vim和emacs哪个更强大?
A:不知道。

Q:哪里能下载到Unix/Linux和C/C++的电子书?
A:参考本版lenovo版主的置顶贴。

Q:我是否需要精通英文?
A:英语是程序员的母语。个人认为,至少应该到这样的水平:读Stevens博士的原著时畅通无阻。

Q:哪里有讲解各种知识的资料?
A:GOOGLE有。如果你想找某个软件,输入名称,点击“手气不错”,就会直接转到主站点。如果你想找某个具体领域的资料,输入名称,加上一句“filetype:pdf”,可以找到很多PDF文档。

Q:我该用进程还是线程?
A:具体问题具体分析,本版精华区有关于线程/进程性能的讨论。

Q:哪里有Unix/Linux的函数说明?
A:man手册是你最好的良师益友。

Q:我想学习Linux的界面编程,学哪个好?
A:ncurse,Gtk+/Gtkmm/Glade,Qt,Motif……都可以,建议去http://www.linuxforum.net的快速开发版下载资料、学习。

Q:APUE好难啊,看不懂怎么办?
A:老实说,我没资格回答这个问题,因为有很多地方我也看不懂。但大体从第一章到第十四章(第十一章或许可以除外?)总该认认真真的读上一遍,写程序试验,中文版看不懂的地方参照英文版理解。APUE写的很深入,而且有些内容确实过时了(毕竟是1992年的书,美国已经出第二版了),与现有OS是矛盾的,但仍然是UNIX程序设计的权威书籍。

Q:这里的人总说APUE,UNP,K&R,TCPL,TCPvX,……,都是什么啊?
A:APUE,Advanced Programming in the Unix Environment,UNIX环境高级编程;
UNP,Unix Network Programming,Unix网络编程;
K&R,Brian Kernighan和Dennis Ritchie的著作,The C Programming Language,C程序设计语言;
TCPL,The C++ Programming Language,C++程序设计语言;
D&E,The Design and Evolution of C++,C++语言的设计与演化;
TCPv1,TCP/IP Illustrated Volume I,TCP/IP详解卷1;
……

Q:为什么编译器说找不到itoa这个函数?
A:因为它不是标准函数,引入此函数根本是多此一举。请用sprintf。

Q:Unix/Linux下有什么好的内存泄漏检测工具?
A:没用过,据说dmalloc不错。

Q:进程退出时会释放空间吗?
A:一定会。如果某块内存只有一个进程在用,则该进程结束时──无论是调用exit或从main返回而正常退出,还是被信号杀死──那块内存都无条件释放。

Q:哪里能找到线程池的代码?
A:UNPv1-2nd第27章就有两个线程池实例(3rd在第30章)。这种等待异步事件(如accept函数的返回)是线程池的主要用场,此外,还有一种是信号驱动的,例如基于定时器的线程池。后一种请参考Me的demo程序(王婆卖瓜一下哈):
http://bbs.chinaunix.net/forum/viewtopic.php?t=536596
http://bbs.chinaunix.net/viewthread.php?tid=541301&extra=page%3D2


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms