忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 50805 | 回复: 71

[Linux] Linux/UNIX系统编程,系统程序员成长的基石?(获奖名单已公布-2014-2-17) [复制链接]

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
发表于 2014-01-09 10:04 |显示全部楼层
提示: 该帖被管理员或版主屏蔽

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2014-01-24 14:09 |显示全部楼层
来晚了。。。 很早就注意到这个活动。。。 但年关时各种忙。。。 一直在慢慢修改草稿。。。  今天貌似已经从C/C++版块的置顶里去掉了。。。   再不改完就没机会发的样子。。。
于是赶紧地。。。


这确实是一本不可多得的好书。
这本书给我的感觉与《Windows核心编程》的很类似:整体的、系统的认识就靠它了。
并且本书的焦点就是Linux,而不像其他一些书籍的讨论的是一个很宽泛的*nix。 对不知道APUE在说啥的同学(比如我自己)不妨先看看这本。

1、您在Linux/UNIX系统编程行业的经历及经验

接触电脑的契机首先是游戏。。。 然后才是编程。
不过十多年前网络上的各种资料比现在少得多,尤其是中文资料更少,自己英语水平也很差。。。 在没人领进门的情况学习Linux/UNIX下的编程很难诶。。。
实际情况是老师教什么就是什么,于是最开始的编程环境自然是Windows。。。 根本就没想过除了它之外还有没有其他选择。。。

本科的时候终于有人教了。但实际上没学到什么东西。

上得台面的原因可能是:确实有太多“周边的”新事物要学。
比如编辑器。现在都还有印象的事情是进了vi就不知道怎么退出。。。最终是在Windows上打开VS读取与编辑虚拟机里的文件然后在虚拟机里编译并运行。。。
再比如编译器。在这个课程很久之后才弄明白从编写C/C++的源代码到执行直接到底发生了什么。更久之后才知道调试的情况。
没有IDE只有一个“裸”gcc在那时候根本玩不转。。。 调试什么的只能printf。。。
还要顺带学make。。。 只好复制粘贴然后不明所以地改到貌似能正确工作为止。。。
上不得台面的原因可能是:课程老师吸引力不够。。。

而在同一时间Windows那边的课程已经开始玩GUI了。
虽然编程的方式从“进入main后一步两步三步四步望着天执行什么由程序员说了算”变到“进入main后准备好各种事情然后由用户来决定该先执行什么”会让人一开始难以适应。
但这是在学编程而不需要再去熟悉编程的“周边”环境。并且相比之前那种黑框白字的程序来说要“绚”得多了。
于是精力就耗在这边了。 总之就是没入门。。。

有点跑题了,不过我觉得教育资源的缺少 —— 入门门槛高又没老师(或师傅)带领,能留下的是少数,又会导致下一代人的师傅更少 —— 是推广难的一个很大原因。

之后为了避免依赖MSVC的特定行为所以在Windows下也会使用MinGW/MSYS,慢慢地对gcc,gnumake等工具比较熟悉了。
因为毕业论文需要实现一个可以分配可执行内存的库于是终于逮到机会进行Linux下的系统编程了。。。
看过APUE等书后可以编程,但依然感觉不得要领,The Art of Unix Programming更是飘渺虚无。。。

最后在论坛的这个帖子里经由雨过白鹭洲介绍知道了这本书。
因为没有太多机会进行Linux系统编程于是至今都没能仔细通读这本书。
但在使用许多*nix下工具时出于好奇或是想确认这些工具能像预期般工作时都会拿出来翻翻。
比如一些web服务器是否用了epoll,sendfile等系统调用,一些程序是否在完成必要工作后确实丢弃了root权限,setuid/setgid程序是如何工作的,以及capabilities等等。

2、Linux/UNIX系统编程职业生涯的发展探讨

因为自己主要是搞技术方面的,所以对业务方面只是闲聊时听听。
这里说几个自己听到的也比较有趣的: 定制广告机、基于雷达监控的停车场管理系统、无盘启动。
它们都需要对Linux有很深的了解于是我们就无能为力了。。。
其实广告机做过一段时间,感觉很吃力。。。 并且业务方面也停了于是就没继续做下去了。。。

3、对于新入门的Linux/UNIX系统编程人员来说,您有什么话对他们说?

嗯。。。 一句正确的废话:“尽信书不如无书”。而且也不仅仅针对书。所有的文章、言论 —— 无论出自何人何处 —— 都应该用作参考而不是代替自己思考。
对这个帖子也是这样。这只是我自己的一些经验,肯定无法适应于所有情况,甚至可能根本就是错的。
有了这样的免责声明后就可以胡乱瞎说一些与这本书有关的经验。

首先,不加思考地将书里所教授的技术直接应用到编程里是一个很不好的习惯。
特定于这本书的内容可以用Daemon有关的章节作例子。
实现守护进程时肯定需要这些技术。但要抵制住“因为自己了解了这些技术于是就要将它应用到自己所写的程序里”的诱惑。
自己写一些程序用于练手肯定没问题。但要将它应用到生产环境时可以考虑“该程序是否有必要自守护化”? 是否有方法可以将“守护化”作为一个可复用的功能?

其次,进程本身以及进程之间的继承关系本身就是一种很有效的复用手段。
继续以Daemon作为例子。
为每个程序实现守护化的功能肯定是难以编写与调试的。
将这些功能实现为一个程序库并在每个程序里复用这个库虽然可以减轻这两个问题,但是就我自己的经验来看这两种方式实现出的程序对用户来说区别不大,依然是自守护化,依然难以使用与管理。

考虑另一种方式。
将原本打算实现守护化功能的程序当作一个“普通程序”来实现:保持在前台、使用stdout,stderr、Ctrl-C退出等等。这样不但利于实现也利于调试。它们专心实现自己打算提供的独特的功能。
而守护化获得的好处、日志记录、崩溃重启、端口管理等等都可以作为另一个(或一组)独立的程序来实现。而它们专心实现这部分功能。
两者一结合就可以用统一的方式管理许多服务程序的各个方面:启动脚本(不需要sysvinit,upstart,systemd混杂)、重启策略、日志(目的地,rotate)、界面(CLI,GUI,Web)等等。

每个程序自己实现后一类功能不仅仅难以做到极致,而且还会引发其他问题。
upstart需要知道自守护化的程序到底fork了几次。
daemontoolssupervisord还需要一些hack来对付自守护化的程序。
这是何苦。。。

类似地,书中还提到了inetd。
提供网络服务并不一定需要使用socket有关的编程技术。可以编写只使用标准输入输出、环境变量、命令行参数的程序 —— 容易编写调试 —— 并配合其他程的序来提供网络服务。
inetd就是这样一种“其他程序”。Ubuntu仓库里提供的5个ident服务有4个都依赖inetd,只有1个是独立实现ident服务。
CGI服务器也是这样一种“其他程序”。

总之,除了“实打实硬碰硬”的编码方式之外可以考虑充实自己的“工具箱”,并针对具体问题选择合适的方式去实现,而不是学会了锤子就将所有问题当作钉子。
在程序里使用直接使用daemon,socket等等是一种直接的、硬的编程方式。
而daemontools,ident,CGI背后隐含的编程思想是另一种间接的、软的编程方式。它有助于产生更简单、容易编写与维护也更稳定可靠的程序。
抵制住“因为了解某种工具就想在程序里使用”的诱惑 —— 包括后一种软的思想也是一种诱惑 —— 并针对具体问题进行分析选择。
以CGI为例。如果目的是为了提供动态网页,当访问数量上升后就会吃不消。这种情况下是不能选它的。而如果只是想避免使用ssh,让一些管理用的脚本可以在浏览器里点击就可以执行,我觉得它就挺适合的。

论坛徽章:
257
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2014-01-09 12:00 |显示全部楼层
1、您在Linux/UNIX系统编程行业的经历及经验
我早先做Windows下的开发,后来逐渐转为以Linux/UNIX系统为主。虽然操作系统不同,但很多思想、技术还是一样的。架构是关键,实现很重要。

2、Linux/UNIX系统编程职业生涯的发展探讨
相对于Web、手机等,Linux/UNIX系统编程技术变化较少,不用不停的追逐新技术,可以做得比较深入,是可以做得长久的。当然“云”的流行,也会带来一些挑战。

3、对于新入门的Linux/UNIX系统编程人员来说,您有什么话对他们说?
技术基础要扎实,忌好高骛远

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
发表于 2014-01-09 15:31 |显示全部楼层
还没参与过这类活动啊,今天抽空回复下

1. 您在Linux/UNIX系统编程行业的经历及经验
最开始在Sun Solaris下开发电信相关的业务,后来转入互联网行业,后台服务端开发是基于SUSE Linux,接着又在CentOS开发,而自己的电脑是Mac OS X(从10.6起就是根正苗红的认证UNIX了)。虽然这些系统都不尽相同,但作为系统编程必读参考书,20多年前的APUE和K&R C依然能发光发热十分坚挺,其实Linux/UNIX系统编程的基石就从来没有动摇过。

2.Linux/UNIX系统编程职业生涯的发展探讨
从职业生涯来看,系统编程处于进可攻退可守的最佳位置,是内核与应用的桥梁。
向上可以做各种应用软件,但又不至于只会用框架或第三方库,别人说epoll/kqueue网络接入能力很NB,你虽然没看过内核代码,但用过select/poll吧,从API用法来看,select/poll是无状态的所以开销大,再一想其实当大量连接都比较活跃时,它们的效率都半斤八两。
向下可以做内核开发,毕竟曾经很接近它了,你熟悉内核向用户提供服务的接口,从接口出发更容易理清逻辑,就像看其他程序代码先找main函数一样。
系统编程经历是职业发展的重要资本。

3.对于新入门的Linux/UNIX系统编程人员来说,您有什么话对他们说?
很多技术万变不离其宗,尤其是Linux/UNIX系统编程,关键是先要搞好这个“宗”,对新手来说看书始终是提高的好办法,而太多推荐资料会吓死人,所以只要真正看懂APUE和K&R C(运行调试书中“过时”的代码也是学习的关键),你就不再是新手了。至于其它,不存在什么捷径,专注和重复就OK了。

论坛徽章:
0
发表于 2014-01-09 16:26 |显示全部楼层
本帖最后由 xike2002 于 2014-01-09 17:47 编辑

好活动,必须支持茂哥!

1、您在Linux/UNIX系统编程行业的经历及经验
答:做linux下的开发好多年了,称得上是linux行业的一个老手了,但算不上个高手。
在这里和大家分享一下我的经历和经验,欢迎大家批评和讨论。
(1)编程思想很重要。不管你在windows下编程还是在linux下编程,其实编程思想是一致的,这就是软件设计的思想。
对于新手来说,他们很少会考虑到编程思想方面的事情,他们的目标就是实现功能,而对于实现功能之外的东西,包括
易用性、健壮性等东西基本上不会考虑的。因为我当年也是从这一步走过来,这只是在说一说当年的亲身体会。当然软件
设计的思想不是一天两天就能够形成的,但是你必须从一开始就培养自己的这种软件编程的设计思想。
(2)选择哪种编程语言其实不重要。很多程序员新手在选择编程语言的时候往往会陷入犹豫之中,不知道该选择C、还是
JAVA,或者是其它编程语言呢。其实选择任何一个都没关系的,只是方向不一样罢了。我一直是在使用C做开发,但是随着
工作的不断进行,慢慢的使用脚本语言的频率越来越高。其实脚本语言的强大是出乎我意料之外的,记得当年刚参加工作
时一位前辈告诉我,在linux下,能用程序实现的东西,几乎都可以用脚本语言来代替。
(3)好的师傅很重要。如果能够在子行业生涯初期遇到一个好的师傅,这简直是一件多么美好的事情啊,当然你也不能完全
把自己的成败完全寄托在一个好的师傅身上,因为自身的努力也是非常重要的。

2、Linux/UNIX系统编程职业生涯的发展探讨
答:职业生涯规划对于很多新手来说是意见很难的事情。因为很少有人能够在职业生涯初期就把自己的整个职业生涯规划好。
职业生涯规划其实是一个不断完善的过程。下面我来谈一谈我的亲身经历。
(1)团队氛围很重要。加入一个好的团队和加入一个差的团队的区别是相当大的。好的团队会帮助你迅速的成长,能把一个
新手变成一个高手。而一个差的团队能够毁了一个高手。
(2)转型也很重要。在合适的时间,你应该考虑岗位的转型。因为你可能当一辈子的程序员的,在技术达到一定的级别的
时候,你可以考虑做方案。


3、对于新入门的Linux/UNIX系统编程人员来说,您有什么话对他们说?
答:前面已经说了很多了,该说的差不多已经都说了。
我想说的是努力学习的同时需要不断的思考。
努力不一定会成功,但是不努力一定不会成功。
最后引用一句前几天总结会上领导说的一句话:所有的伟大都是时间的函数。

论坛徽章:
459
亥猪
日期:2014-05-31 12:08:03亥猪
日期:2014-05-31 12:07:38亥猪
日期:2014-05-31 12:08:04亥猪
日期:2014-05-31 12:07:43亥猪
日期:2014-05-31 12:07:52亥猪
日期:2014-05-31 12:08:09亥猪
日期:2014-05-31 12:07:51亥猪
日期:2014-05-31 12:08:02亥猪
日期:2014-05-31 12:07:59亥猪
日期:2014-05-31 12:07:37亥猪
日期:2014-05-31 12:07:50亥猪
日期:2014-05-31 12:07:39
发表于 2014-01-09 16:28 |显示全部楼层
就是感觉不方便...

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
发表于 2014-01-09 16:30 |显示全部楼层
本帖最后由 crazyhadoop 于 2014-01-21 00:00 编辑

1.  断断续续的也有4年的Linux系统开发了,从开始的玩具小程序,到今天每天数亿访问请求的应用开发,也算是成长了很多,这里面有血有泪啊,不过也是一行一行的代码敲过来,一个一个方案的做测试,除了业务的发展推动,另外一个非常重要的基石就是实实在在的看了那么几本书,基本快翻烂了,只有实践才能真的知道在各种服务压力之下,性能的瓶颈在哪里?改进的空间在哪里,改进的方向在哪里。学而不思则罔,思而不学则殆。如果只看书不在各种环境下实践,无法知道自己所学有多大的威力。如果没有书的指导,可能无法游刃有余的理清思路,探索方向。真是那几本宝典指导了我如何去做。

2.现在看起来做移动端的可能比较火热,但我想说的是,其实无论现在什么发展最火,服务端永远是充满挑战的地方,现在的服务挑战性相比较以前更大了,各种大数据,高并发,可以做的事情也更多了。这对个人的要求也越来越高,但是实际上用到的知识还是Linux系统开发的那些基础知识外加一些高效的数据结构。原来的进程可能只在一台机器上,现在分散到多个机器上而已。小处着手,做的工作更细致了。打好基础,就可以坐等万丈高楼平地起了

3.

这本书可以说是相当实用,极力推荐,我看过一部分英文章节的内容。感觉很赞。既可以当参考书又可以当教材。这本书比高级UNIX环境编程(apue)更适合学习*nix的系统编程。
首先这本书非常详尽,比apue更适合入门,作者的例子也多。更容易实际操作,用以练习,难度循序渐进,不像apue有点高大上。每个章节分的比较清楚。可以按序阅读,也可以按需阅读。语言简练,条理清晰,代码示例简单明了,新手可以轻松敲打代码,试验效果。这本书读敲下来功力应该是相当了得了。

论坛徽章:
0
发表于 2014-01-09 17:11 |显示全部楼层
不懂,来看看
就当学习吧

论坛徽章:
0
发表于 2014-01-09 17:37 |显示全部楼层
看过一些这本书的英文版本,记得它是amazon上五星级的图书,被liunx/unix工作者大力推荐的好书,也是一本非常好的书,和APUE是一对好伙伴。在linux工作多年,算不上什么高手,但是有一点,就是很多时候在liunx学到的东西可以一劳永逸,不像window上的技术,变化多,跟着学习都学不过来。总之一句话,liunx直得程序员去花时间学习,它就想vim一样会让你体验都无穷乐趣。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2014-01-09 23:45 |显示全部楼层
1、您在Linux/UNIX系统编程行业的经历及经验
       大一暑假买了APUE,断断续续到大三下学期才看完。毕业后从事更底层的开发工作,还算是按步就班走过来的吧。

2、Linux/UNIX系统编程职业生涯的发展探讨
       系统编程还没有一个很好的定义吧。我的理解理解是,有最大的灵活度控制资源、只依赖于操作系统与基本库的抽象
       的编程。从市场职位情况上考虑,用大白话说,可能就是服务器后端开发。与之相对的是各种Java/Python/Ruby项
       目,特征是抽象层次高,基本跨平台。这也是系统编程给人靠近底层感觉的原由。

       如果坚持一路走下来,职业生涯与其它方向并无二致。如果仅将此作为过渡的话,后期职业生涯的选择倒挺多。系统编程
       正好卡在中间,可上可下。现在互联网如火如荼,越上层反倒越吃香。

3、对于新入门的Linux/UNIX系统编程人员来说,您有什么话对他们说?

      o 有全局观,认清层次。语言层(标准),库层,系统层(API),平台层(ABI)。
      o 学一门动态语言;不要瞧不起Java之流。
      o 掌握一点内核知识,但求流程,无需细节。
      o 不要错过开源宝库。
      o 保证自己的代码量。

论坛徽章:
39
水瓶座
日期:2013-08-15 11:26:422015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之乌兹别克斯坦
日期:2015-03-27 14:01:172015年亚洲杯之约旦
日期:2015-03-31 15:06:442015亚冠之首尔
日期:2015-06-16 23:24:37IT运维版块每日发帖之星
日期:2015-07-01 22:20:002015亚冠之德黑兰石油
日期:2015-07-08 09:32:07IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-10-10 06:20:00IT运维版块每日发帖之星
日期:2015-10-11 06:20:00IT运维版块每日发帖之星
日期:2015-11-10 06:20:00
发表于 2014-01-10 02:50 |显示全部楼层
本帖最后由 forgaoqiang 于 2014-01-24 13:24 编辑

非常佩服精通Linux/Unix系统编程,不但对操作系统要有了解也有很深的C/C++水平,当前也只略微看过《Linux程序设计 第四版》,大部分工作还停留在使用shell来完成的水平上,虽然经验不错,也分享下自己的拙见,顺便围观CU大牛。

1、您在Linux/UNIX系统编程行业的经历及经验

从大学开始,使用Linux系统有6年左右了,大多数时间都在使用而不是开发。最近也开始写一些简单的小程序,以满足定制的产品的需求。一开始使用shell进行简单的操作,后来遇到性能和保密的问题(有点猥琐,C语言编译后的确是比明文的Shell安全很多),开始使用C语言进行重构。
大多数操作都是文件系统中文件的读写,字符串的操作,然后进行Socket通讯,只会这一些也不敢说懂Linux编程。
大多数时间都在OpenWRT上做开发(可以理解成Redhat精简版本,是个路由操作系统),上面的C标准库虽然不完整,但是基本的函数还是能够正常使用的,配合专有的UCI(Unified Configuration Interface)可以快速高效的读写配置文件。
网络数据传输采用了JSON的编码方式,配合openwrt上的 jshn 工具(json编解码C程序),数据编码传输问题也解决了。
现在对Linux系统上基本的文件读写、字符串的操作比较了解,以后可能会考虑使用C++来做。


2、Linux/UNIX系统编程职业生涯的发展探讨

Linux/UNIX系统因为其开源的特性,很多需求完全可以通过修改源码或者自己进行编写,这一方面无疑非常的便利。而且对于国内的程序员或者开发公司来说,大量的开源项目也是吸引他们的重要原因,很多需求只要找到一个合适的开源项目,然后去研究一下,少量修改定制就能够成为自己的产品,因此个人认为Linux上的编程还是非常有前途的。
至于Linux/UNIX系统编程来说,主要面向系统本身的功能进行编程开发的话,可能需求没有那么强烈,这些工作完全可以等待Linux开源社区来完成,然后加以利用。
因为Linux系统编程本身并不需要完全理解Linux内核,也不需要完全弄明白系统是如何工作的,在其提供的大量的开放API上进行“二次开发”即可,难度也不是太大。、开源的路由操作系统都在快速发展。极路由等厂家也是采用了Openwrt这样的linux系统然后在其上进行开发。Linux/UNIX系统编程职业生涯的话要往某个方面进行精细发展,精通于特定领域而不是范范整个系统各方面的内容。



3、对于新入门的Linux/UNIX系统编程人员来说,您有什么话对他们说?

①找本好些的书吧,以前我看得是《Linux程序设计 第四版》,感觉还算是不错,各个方面都有涉及,前几章也对shell进行了概述性讲解,后面对系统各个模块进行了讲解,也涉及到mysql这样开源数据库的开发,现在来看这本新书《Linux/UNIX系统编程手册(上、下册) 》也是非常不错的选择。
②多看些Linux本身以及其实用工具的源码,这些都是精挑细选,几乎无法再优化的经典之作。比如当时我看grep的源码的时候就感到惊叹,本以为这么强大的工具肯定有庞大的代码量,后来发现里面很多精妙的设计,查看优秀的程序设计源码真的能快速提高自己的编程思想。
③多做些笔记吧,除了传统的学习笔记要按照功能/类型划分,也要整理自己的代码库,形成专属代码库,不是每一次每一个功能都需要从头写的,需要的话快速找到自己需要的函数封装,后期能够快速完成开发。
④能找个“高手”做指导最好了,我当时完全自己生硬的缓慢学习,很多时候一个简单的问题网上查找半天,甚至多日后才突然明白,这样学习起来太痛苦也太没效率,要是有个师傅带,一定要珍惜。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP