Best unix operating system books according to redditors
We found 237 Reddit comments discussing the best unix operating system books. We ranked the 65 resulting products by number of redditors who mentioned them. Here are the top 20.
We found 237 Reddit comments discussing the best unix operating system books. We ranked the 65 resulting products by number of redditors who mentioned them. Here are the top 20.
Well, we hit the 10000 limit. Reserving this comment for the misc. section.
FREE TIME/FUN/MISC.
The Art of Deception: Controlling the Human Element of Security
The Art of War
Steal This Computer Book 4.0: What They Won't Tell You about the Internet
How to Disappear: Erase Your Digital Footprint, Leave False Trails, and Vanish without a Trace
The Best of 2600: A Hacker Odyssey
Super Crunchers: Why Thinking-by-Numbers Is the New Way to Be Smart
Casting the Net: From ARPANET to INTERNET and Beyond thanks sjhill
A Quarter Century of UNIX thanks sjhill
A Reading List For the Self-Taught Computer Scientist thanks zinver
How to Talk So Kids Will Listen & Listen So Kids Will Talk thanks segamix
The Black Swan: The Impact of the Highly Improbable thanks AgonistAgent
Snow Crash thanks AgonistAgent
Cryptonomicon thanks Mirple
You must be on x86_64 Linux. Extract the tarball into a directory of your choice. Set the environment variable LD_LIBRARY_PATH to include that directory. Then run randprog in that directory. If you don't understand what I just wrote, go away and learn before coming back. This book will help you https://www.amazon.com/Unix-Programming-Environment-Prentice-Hall-Software/dp/013937681X
To be fair, only one of them appears to be reading the UNIX book; the other girl is reading a paperback novel.
Worse yet, it's not even a very good UNIX book. Wake me up when you've got a photo of a hot chick reading Stevens. Gotta have standards.
If you're new to C, read K&R.
Once you've done that (or if you already know C) then read THE book on Unix programming
Advanced Programming in the UNIX Environment
Advanced Programming in the UNIX Environment, 3rd Edition
If you know some C, this is a great book with a hands-on approach and plenty of code examples.
>Why does Linux limit itself to this file name size?
What should it be? Posix requires it to be capped at NAME_MAX. That could be anything, but on my Linux distro happens to be 255. You could increase that and recompile your libs and apps if you wanted, but the Posix folks happened to choose to put a compile-time constant length on things back when. They probably did that because it makes handling some things more convenient. I imagine that somewhere, there's code that statically-allocates stuff of NAME_MAX + 1 length, so jacking up NAME_MAX to, say, 1MB would probably cause some programs to use a lot of memory...so that hasn't been done.
As to why Linux uses 256 instead of NAME_MAX + 1 in the header, go look at your system headers. On my system, /usr/include/x86_64-linux-gnu/bits/dirent.h has the following:
char d_name[256]; / We must not include limits.h! /
I imagine that 256 is used rather than NAME_MAX + 1 because they don't want to have the kernel header depend on that other header; maybe it creates a dependency loop, where limits.h depends on dirent.h and visa versa to find various constants. I'm not sure which standard "owns" NAME_MAX, but perhaps it's something that the kernel provides and libc is responsible for setting based on the kernel. It does seem a bit odd that there isn't a constant defined in the kernel headers (that libc defines NAME_MAX to on Linux) that is also used here and anywhere else a filename might show up, but I expect that the kernel folks had a reason for that.
EDIT: note also that the Windows API has a similar such restriction:
>>What is the maximum length of a file name?
>
>Windows usually limits file names to 260 characters. But the file name must actually be shorter than that, since the complete path (such as C:\Program Files\filename.txt) is included in this character count. This is why you might occasionally encounter an error when copying a file with a very long file name to a location that has a longer path than its current location.
Huh...I thought that they had a maximum path length of 1024 characters (or bytes; don't recall) but then I haven't done Windows programming for a while now...seems that 260 is correct, though.
>As a side note: any links to really good resources or articles for Unix/Linux systems programming in C would be much appreciated.
Seems like a pretty broad range of material, if you just want articles. I mean...you might want to narrow down what you're looking for a bit. I think that Advanced Programming in the Unix Environment is probably a worthwhile book to go through, if you just want a "C on Unix" book.
Hey,
I assume you have good grasp about the culture and ecosystem you want to work in by now. This means you're in a perfect situation to dig deeper.
My first advice would be to be more specific in your goal. Find a project which is interesting to you. This will help you to cut down the list of "things to learn", as you will concentrate on the tools the project uses.
In your tool belt should be at least:
Suitable answers can be:
This list is enough to keep you busy for a year easily.
Here is a list of recommendations of resources which proved invaluable for me (based on the list above and more; this list contains free web resources and books):
Learn about GitFlow and the arguments against it. Write good commit messages. Understand different versioning schemes (https://semver.org/ ; http://calver.org/ ).
Unfortunately, apart from it, good resources on kernel programing are sparse. After working through this book your best bet are the drivers in mainline, the kernel documentation and google. Have a look at kernelnewbies for an introduction on how to get involved with mainline.
Regarding your ideal schedule: I cannot answer this to be honest.
/Rambling ahead/
But: find a hobby project (e.g. implement a Z-machine) you want to realize in "a professional manner".
What I mean by that is, strive to use all the tools you want to learn in a disciplined manner. Put your project out there on a public git host and assume you have real users who want to build your stuff on their own machines. Treat this project as your business card, don't be afraid but improve it constantly.
There is always something you didn't know. You will always find things to improve, even it's only a improvement from a purist standpoint. But your "hobby" project is not done as soon as it works. It's a test bed, a record of what you've learned. It is a reference point for the future you to come back.
Read blogs about development. Learn a object oriented language and see how you can apply these concepts in C (encapsulation, "object orientated design in C without classes"). Learn a functional language just to see something completely different (Haskell / a scheme / Common Lisp ). Realize that it's sometimes just a bad idea to use C for some projects / parts of a project.
Consider to always learn the "core tool" first and then its "high level abstraction tool/helper". Eg: learn the basic usage of the
gdb
/git
comandline tool before you dive into a graphical wrapper. Depending on your environment you wont have access to the wrapper, but the cli tool will be (hopefully) there. For example I use emacs (i know vim too) for git nowadays, but I'm not lost if I don't have access to it. Also it is always good to understand the core concepts.Read Linux Weekly News (access to the archive is free), have an eye on the Linux Kernel Mailing List. Bootlin.com has a ton of great learning material regarding embedded Linux, Driver programming, Yocto and buildroot.
Don't be afraid to jump into an IRC channel / a mailing list, but be sure to do your homework first. They'll eat you alive if you didn't. (see http://www.catb.org/~esr/faqs/smart-questions.html)
Be open but do your own research. Inform yourself on the pro and cons of everything. Don't believe in "silver bullets".
It will be a steep learning curve in the beginning, but with every step you take it gets easier.
Hope this helps you on your journey.
Personal Info/Disclaimer: I'm a "professional" (i get paid) "embedded Linux" developer, writing system programs and kernel drivers for about 8 years. I still learn stuff every day. Recommendations are heavily based on my own experience and what I use still on a day to day basis. Regarding on what you want to do this list may lack information.
edits: grammer, formatting, multiple additions in the first 2h
I like this cheatsheet and this book: Learning the vi and Vim Editors.
Edit: I forgot about Vim Adventures!
You definitely want this book for debian
The Debian Administrator's Handbook
You might also look for a book to teach you the basics of command line tools and system configuration files. I used to have a book I really liked but its too old to be found these days.
edit:
This is the one we used at university
UNIX System Administration Handbook
I'm not sure I would recommend it though as I'm not sure its the best. There is plenty others out there.
You should also try to compile your own kernel at some point just so you know how it is done and how you can tune a kernel if you need to.
Same here (but also got a copy of "Advanced Programming in the UNIX Environment" by W. Richard Stevens, Stephen A. Rago
http://www.amazon.com/Programming-Environment-Addison-Wesley-Professional-Computing/dp/0321525949).
I'm a graduating senior studying computer science. Last semester I took an intense C course (Advanced Programming in C and C++ (Spring 2014 course page)). The majority of the class focused on C, with the last few weeks introducing C++ concepts such as the built-in data structures and templating. The hardest project was writing a web server in C, and although you probably won't be doing anything like that, I recommend you dive into these books alongside K&R:
Advanced Programming in the UNIX Environment, Third Edition. Can be pricy, but you may be able to find this online if you know where to look. I recommend you have a hard copy as a reference manual though.
Learn C The Hard Way. Say what you want about Zed Shaw, but I worked through this book alongside K&R just before I started Advanced Programming and really liked the way he takes you through the C fundamentals. The book is free in HTML form, or you can opt to buy the eBook.
Hope that helps!
It’s gonna be hard to give you much without picking a specific OS—details can vary widely even within a single OS family line—but an OS book is probably a good place to start. Tanenbaum’s book is the go-to.
Alternatively, there are books on specific techniques like garbage collection, or books more generally on programming for UNIX/POSIX/Linux or Windows (via Win16/32/64 API, not the six-mile-high shitheap piled atop), which would tell you some about how memory management works in down at least to whatever abstract hardware interface the kernel uses.
https://www.amazon.com/Advanced-Programming-UNIX-Environment-Addison-Wesley-ebook/dp/B00DB3G8KY/ref=sr_1_3?keywords=unix+programming&qid=1557633707&s=gateway&sr=8-3
​
or if you're on specifically linux,
https://www.amazon.com/Linux-Programming-Interface-System-Handbook-ebook/dp/B004OEJMZM/ref=sr_1_3?crid=3Q06MI8R2WQP5&keywords=linux+programming+interface&qid=1557633730&s=gateway&sprefix=linux+prog%2Caps%2C178&sr=8-3
​
If you want a more general idea of how operating systems work, look at https://www.amazon.com/Modern-Operating-Systems-Andrew-Tanenbaum/dp/9332575770/ref=sr_1_3?keywords=Andrew+S.+Tanenbaum&qid=1557633792&s=gateway&sr=8-3 or any of Tanenbaum's other books. He's one of the most prolific writers for OS theory.
I can't recommend that book enough. It will give you a great overview over the services the kernel provides, design decisions and data structures.
In addition to that, these resources might also be of interest to you:
Get a programming language, but also get some literature on the theories that programming uses. A book on algorithms and another on data structures would pretty much do the trick.
And why start with Python when you can start with C and then move onto java? I am sure you are a smart guy, and understanding those 2 languages will give you the lingua franca you need to comprehend the best textbooks/references on advanced programming concepts that will help you out.
I suggest:
1 Get this http://en.wikipedia.org/wiki/The_C_Programming_Language
2 Install linux (ubuntu probably is the way to go), you'll probably dual boot
3 Get this http://www.amazon.com/Unix-Programming-Environment-Prentice-Hall-Software/dp/013937681X
4 Learn your shell (the bash shell), learn how to use C, sed, awk, regex etc. These are all super-useful tools. This is an entirely approachable set of topics, don't be daunted.
After doing all of that it is time to get to java.
1: Pick up Head First Java (and download all of the book exercises from the publisher's website. This will be your first book in java.
2: Download all java docs from Oracle (so you can reference them).
3: Pick up Thinking in Java by Bruce Eckel (this will be your other Java book to learn from).
All of this should more than occupy your 6 months. After this you'll be ready to learn some more advanced concepts with these as your solid foundations. If you want to play with databases (a good idea) and integrate them into your programming then check out SQLLite.
http://sql.learncodethehardway.org/
I believe this book would be of interest, its big and bad, but from memory it is exactly what you are looking for, infact it basically gives you all you need to know to start implementing your own fully featured shell:https://www.amazon.co.uk/Advanced-Programming-UNIX-Environment-Addison-Wesley/dp/0201433079
EDIT: Seems there is a new edition, it is over 25 years old and has been updated multiple times to cover new standards so this one is probably better, https://www.amazon.co.uk/Programming-Environment-Addison-Wesley-Professional-Computing/dp/0321637739/ref=dp_ob_title_bk
I learned the basics of Lisp from this
book, which you can get online for free. Although it's about Common Lisp you
can translate most of it easily to Elisp, just (require 'cl-lib) and you will
be fine. For another quicker but great introduction to Lisp I recommend
reading the first three chapters of
PAIP
The old Writing Gnu Emacs Extensions
still serves as a good introduction to learn Emacs APIs. I also learned a lot
more about Elisp reading nullprogram.
Reading code of small packages which solve something you are interested in is
another great way to further improve your Elisp skills.
>I was just wondering if there would be any huge benefit to taking this class(and paying for it) as opposed to dicking around with it on my own
Here's one of my favorite books, because I'm impatient. It's called Unix for the Impatient.
http://www.amazon.com/UNIX-Impatient-Edition-Paul-Abrahams/dp/0201823764
Frankly I wouldn't pay too much for a class. You can install Linux for free (and if you have a Mac you already have a Unix system) and there's so much information online that the self-directed learner has many options and paths. But of course classes provide structure, and that's good too.
The approach I took is to start with commands and languages using regular expressions: find, grep, sed, awk, python or perl, etc. These are very powerful and useful commands.
Two books I highly recommend are [Unix Shells by Example] (http://www.amazon.com/UNIX-Shells-Example-4th-Edition/dp/013147572X/ref=sr_1_1?ie=UTF8&qid=1374157897&sr=8-1&keywords=unix+shells) and [A Practical Guide to Linux] (http://www.amazon.com/Practical-Guide-Commands-Editors-Programming/dp/013308504X/ref=sr_1_1?s=books&ie=UTF8&qid=1374157979&sr=1-1&keywords=practical+guide+to+linux)
Also check out (PDF warning!) [Advanced Bash Guide] (www.tldp.org/LDP/abs/abs-guide.pdf)
These all are excellent, and very useful.
Unix for the Impatient was mandatory when I went to uni
The first book you need is Advanced Programming in the UNIX Environment. This is the bible for socket programming (among other things).
This book is based on C. A good resource is The Indispensable Guide to C.
Hope this helps.
In addition, he co-wrote The UNIX Programming Environment and The Practice of Programming with Rob Pike and The Elements of Programming Style with PJ Plauger. I've never read the Practice of Programming (add it to the wish list) but the other two books are fantastic. The Elements of Programming Style is somewhat dated (code is in PL/I and Fortran, and it discourages things like
goto
which we all already know is bad) but a lot of it is still relevant and worth picking up a used copy if you can find it.A note re: jumping into The Linux Kernel -- This is best tackled while simultaneously reading a book on the kernel like Linux Kernel Development (3rd Edition) by Robert Love and a book on general *nix fundamentals like Advanced Programming in the Unix Environment by Stevens and Rago.
Linux or *nix programming in general basically means C programming using system calls. If you are interested in this kind of stuff one of the best books I've ever read on the subject was the Advanced UNIX Programming by Marc Rochkind. Obviously, you have to have a fairly strong C background in order to read this book, but if you want to get into Linux programming this is one of the best books out there in my opinion.
Shell scripting is fine to know (and probably you should) but that doesn't count as Linux programming, the shell is just a tool targeted to the user aka sysadmin to help them manage their system more effectively.
two of mine were The Design of the UNIX Operating System and Advanced Programming in the UNIX Environment
one of the other big things was some original unix documentation. I cant recall the name of them but there were small paperback book released early on for unix describing how to use and program for it. I remember someone linkijg to it either on reddit or hn a couple months ago.
And here are links to buy "Learning the vi and Vim Editors" from O'Reilly and from Amazon, in case you don't want to steal some learning material.
The best thing you can do is read (at least that is the way I learn the most, the fastest)! That being said, there are tons of free videos on youtube that go over networking and how it works. Figure out ways to apply your knowledge by setting up a network of your own and making it rad.
I think learning unix/linux is the way to go if you are into servers, but that is my bias. I am not a fan of Windows. In reality, you end up doing a lot of the same tasks when adminning, regardless of platform. Servers are just computers that run services (like http, ftp, nntp, email, etc). You basically just have to learn how to install, configure and run those services and learn best practices about installing and configuring the OS to do what you want it to do the best.
I highly recommend going into linux/unix adminning. I am not a huge windows fan. That being said, there are jobs there and if you can tolerate working with windows, it might not be a bad route to go if you want to be an admin for the rest of your life. I think nix admins end up doing more development work in the long run (which is more fun imo). As far as learning nix, I highly recommend unix power tools. I am sure there are tons of tutorials as well, but this book gives you a good idea about how to interact with the command line and gives you a great introduction to many of the tools available to you and when to use them. Setting up servers just means installing some services and getting them running in a smart way. There is usually a lot of documentation available for the service you are downloading and about how to configure it.
Regarding programming, pick a language and start using it for everything you can! When you install a service, pick a program that is made in that language to run on it (i.e., install/configure apache and then run a program written in python on it!). I highly recommend starting out with python, but choose whatever you want. Python has a ton of free documentation and ton of well-written apps available. Its syntax rules will force you into writing better looking code, which will carry over to other languages you will learn in the future. Learn python the hard way, dive into python, MIT OCW, Khan Academy. Pick an open source project and start helping out any way you can! At first, it might just be updating documentation, then you might fix some small/easy bugs and soon you will be fixing things and helping direct the way you want to see the project go (or perhaps start your own project!).
If it gives you any hope - I have worked it helpdesk, sys admin jobs, run IT departments and now work as a programmer, all without (much) formal training. I have taken courses over the years, but I think you can a lot just by reading, watching videos and then finding ways to apply that knowledge!
edit: I don't know where you live, but if you can, find local user groups to participate in and talk to locals. You may be able to find a job in the field and have a real way to apply that knowledge on a daily basis.
If you have any questions or need ideas about projects to start, please feel free to ask.
Both Advanced Programming in the Unix Environment and volume 1 of Unix Network Programming are out in updated editions by other people. (Stevens has unfortunately died.)
http://www.amazon.com/Programming-Environment-Addison-Wesley-Professional-Computing/dp/0321637739
I am currently taking my systems programming class for my CS degree. We use linux, with C and VIM, and have a couple of books that are actually really helpful.
This book will walk you through C and its syntax. I have read through most of it. Its pretty easy to follow and comprehend.
https://www.amazon.com/Programming-Language-Brian-W-Kernighan/dp/0131103628
This book I havent cracked open yet but plan on it today. My teacher swears by it, however.
https://www.amazon.com/Unix-Programming-Environment-Prentice-Hall-Software/dp/013937681X
If you're serious about this, and want to do it right, I'd recommend locating a copy of Writing GNU Emacs Extensions by Bob Glickstein.
While it is a little out of date with respect to recent versions of emacs (some things are easier now, and a few "best practices" have changed), it is still an excellent overview of writing emacs extensions.
I'd be a little cautious about following it's tutorials due to the previously mentioned changes (you will still need to do some additional manual reading), but as far as a starting point and overview of what is involved, I can't think of a better resource.
Just because textbooks and reference books can be dry doesn't mean they're not creative.
Here's another and another. O'Reilly published books have a couple clever or "funny" ones.
I'd recommend watching Writing Games in Emacs for a simple tic-tac-toe mode and then reading Writing GNU Emacs Extensions which culminates in a crossword mode.
> It is a real Lisp and a good starting point
While not directly related, there are a lot of classic Common Lisp and Scheme books that while not explicitly the same as Emacs Lisp, wrinkle the readers brain in a way that is useful for coding in emacs lisp and becoming a better programmer in general IMO.
All of the texts I have read that are listed on A Scheme Bookshelf and A Lisp Bookshelf have been great reads; also they are excellent texts for reference on how to make great technical literature on par with Donald Knuth's books with respect to quality of presentation.
Writing GNU Emacs Extensions is still mostly relevant, despite its age, which IMO is a testament to how timeless Emacs is.
An Introduction to Emacs Lisp is great, and also included with every Emacs installation.
Link for the curious: https://www.amazon.com/dp/1793390096/
Pretty awesome print, tbh.
Advanced Programming in the UNIX Environment by Stevens and Rago.
thanks for the quick response! it was exactly what I thought. I will probably also buy 9front book :D
Self taught professional software engineer here.
Which language you learn is not as important as learning about data structures and complexity analysis. Code organization is also very important.
Pick one high level scripting language (like Python, Ruby, Perl, etc) and one low level systems language (C, C++, Rust, etc) and learn them both inside out.
A couple of books I recommend:
As far as practical skills go, you need to learn how to use
git
(or whatever VC system the companies you are interested in use). You need to learn how to use Unix systems. A great introduction is The UNIX Programming Environment. You need to learn how to read other peoples' code, open source projects are great for that.When you are getting ready to interview, there is no better resource than Cracking the Coding Interview.
"The Unix Programming Environment"
there lies your problem, Unix is not linux. Also, I'm guessing this is the book you are using? If so, that is from 1983.
Don't overlook the included user manual. :help usr_toc will take you there. It is based on the book "Vi IMproved--Vim," which is also available free in PDF format on the Internet because it is published under the Open Publication License. The book is dated, but the manual is up-to-date and tracks with the book very closely.
Derek Wyatt's tutorial videos are good, but there is another vim video tutorial set at Vimcasts.
If you would rather read, but don't want to dig into a five-hundred page book, "A Byte of Vim" may be more manageable. Several of these resources are listed in this subreddit's sidebar.
Several books are now available that cover Vim nicely: "Learning the Vi and Vim Editors," "vi and Vim Editors Pocket Reference," "Hacking Vim 7.2," "Practical Vim: Edit Text at the Speed of Thought," and a brand new book: "Pro Vim," all available on Amazon.
As far as configuration and general setup goes, I think this Steve Yegge article is probably the best: https://sites.google.com/site/steveyegge2/my-dot-emacs-file
As far as a good intro to emacs programming, I recommend the book 'Writing GNU Emacs Extensions' by Bob Glickstein http://www.amazon.com/Writing-GNU-Emacs-Extensions-Glickstein/dp/1565922611
It is an excellent guide to writing elisp code. It starts very gradually with simple "how to make emacs more comfortable" chapters, to writing a minor mode to writing major modes. Don't let the age of the book fool you, it is still 95% applicable to modern emacs.
I haven't read the book but after attending his talk not surprised to hear this at all ;-)
I still find David Butenhof's Programming with POSIX Threads the best introduction to thread-based concurrency even through there is zero C++ (modern or otherwise). But once you understand the fundamentals (like why you need to hold the mutex when calling wait() on condvar), then all the APIs (like that of C++11) become fairly transparent.
Books that I find very useful:
Beginning Portable Shell Scripting: From Novice to Professional
From Bash to Z Shell: Conquering the Command Line
Unix Power Tools, Third Edition
The UNIX Programming Environment
Running Linux (mine is old, but still useful)
I have bought lots of other useful books from O'Reilly.
Anything written by Michael W Lucas.
I realize this has more than the OP was looking for (ie the other shells). but UNIX Shells By Example is by far my favourite book I've come across in terms of learning scripting, might want to check it out.
Why don't you start reading this?
Should help u a lot with Unix Internals and system calls.
For an intro to general Unix wizardry, I'd recommend Unix Power Tools. It covers all the basic Unix tools, and shows how they can be used together effectively.
To be a real Unix master, you should also learn Perl. If you want to go farther and master Perl you can't go wrong with that.
Once you know the basics of Perl, get the Perl Cookbook, which has many great recipes for doing things like in your list. In fact, if I recall, that very example might be in the book; if not, one very close to it is.
I always had a hard time learning from man pages. They're great for reference once you've already got your bearings, but in my opinion these books will serve you far better.
I like to use nano for simple file editing, such as changing a config. For programming, I switched from Gedit to Atom to Vim. This book is what finally made Vim click for me. Following along with that book, after a week, I was just as productive in Vim as I had been in Atom, after using it for 1-2 yrs. My main reason for switching to Vim is that Vi/Vim are a pretty standard default install on most distros, so you're pretty much guaranteed to have it everywhere. I've never tried using emacs, so I can't say anything good or bad about it.
> unix power tools book
This?
Senior Level Software Engineer Reading List
Read This First
Fundamentals
Development Theory
Philosophy of Programming
Mentality
Software Engineering Skill Sets
Design
History
Specialist Skills
DevOps Reading List
I'd make sure I have a really solid understanding of systems and networks, e.g. how Linux works. This book seems like a great overview and I love No Starch Press. There's also this book which is used by Carnegie Mellon's introductory systems course, though that might be a bit too deep to dive into straight away, more like something that could be used if you want a deeper understanding of how systems work. You should have some familiarity with C just as foundational knowledge. The guy who wrote Learn Python The Hard Way also wrote an intro to C, Learn C the Hard Way. He's added a lot more material than the last time I checked (~Dec 2012) which looks like it covers a lot of topics so it would be great to work through it.
Some more technical books on this subject that are well regarded and can be used as reference books are Advanced Programming in the Unix Environment, Unix Network Programming, and The Linux Programming Interface
Also in addition to Python I'd also suggest learning some Ruby (Practical Object-Oriented Design in Ruby and Programming Ruby 1.9 & 2.0 are two resources I'd recommend), it's what Chef is/was implemented in and is fairly nice to work with.
I've been slowly working my way back through this book to make sure I still remember everything. They have a newer edition out for it, so get that if you decide to pick it up. It's not a light read, and assumes you already know a fair bit about C, but it teaches things that are crucial to practical programming.
As for GTK+, there aren't too many good books on it unfortunately - at least that I've seen yet. I picked up a "Foundations of GTK+ development" book when I first started learning it. It gets you going, but leaves out a lot of what I would consider important details for more advanced things. For example printing is only very breifly covered. If there's one thing users are going to want it's printing support..
It's not online and you have to *gasp* pay for it, but I've found the classic book UNIX Programming Environment to still be one of the best introductions to UNIX and C programming. It is also a great introduction to the UNIX mindset.
The closest thing I can think of is Uresh Vahalia's book "UNIX Internals". It's more technical than Code, but it's really quite well written and clear. It's somewhat hard to find, though.
http://www.amazon.com/UNIX-Internals-The-New-Frontiers/dp/0131019082
Unix Shell Programming (3rd Edition), by Stephen Kochan (old bell labs employee):
http://www.amazon.com/Unix-Shell-Programming-3rd-Edition/dp/0672324903
The Unix Programming Environment
> The marketing of Plan9 for the biggest part consist of snobish comments like yours, so i conclude you don't want more users. The Lisp guys are more open than you.
On this you are quite right, but then the Plan 9 user base very heterogeneous, in the end most people just don't care about marketing, they are happy to sit in a corner and do their thing and don't care much if the rest of the world jump from a cliff.
> Plan9 doesn't provide anything to non-programmers, they wouldn't get from UNIX and some things are better in UNIX.
Don't underestimate the intelligence of non-programmers, I know biologists, medicine students and even a law student that use Plan 9. I think the wonderful thing about the original Unix philosophy, and that is taken even further by Plan 9 is to allow people that are not programmers to use some really simple but also powerful tools to do their job. Of course it requires a bit more initiative and creativity, but at the same time you are much more free to take advantage of the system for tasks that it was not designed for.
The Unix Programming Environment is a book I think ever computer user should read, because it shows how everyone can easily learn to program their software environment... if that environment is built properly.
> For example Plan9 was praised for the beautiful fonts, when they invented utf8, but Apple surpassed them long ago.
I don't see what you mean by "surpassed", last I checked OS X still has trouble dealing with UTF-8 properly(I wont argue the details because I'm not a OS X user, I only report what I heard), as do every other Unix system I have ever tried. The Plan 9 UTF-8 code was written in 92', and has barely changed since, because it just works!
Anyway, the most important thing about Plan 9 is not just the code(which is worth admiring and studying by anyone interested in writing top quality software) and the innovative ideas(which are worth copying), but the philosophy, which is not too different from the original Unix philosophy... which unfortunately everyone forgot long ago. Programming is the art of managing complexity, and you don't fight complexity by adding extra complexity, you fight it with simplicity and clarity.
The cheapest, fastest, and most reliable components are those that aren't there. -- Gordon Bell
Install ubuntu. Then read this, the same than anyone else for the last 3 or 4 decades:
https://www.amazon.es/UNIX-Programming-Environment-Prentice-Hall-Software/dp/013937681X
My school is still using this text http://www.amazon.com/UNIX-Impatient-Edition-Paul-Abrahams/dp/0201823764. It's a bit outdated in parts..
I got this one a few years ago and it really helped: http://www.amazon.com/Learning-Vim-Editors-Arnold-Robbins/dp/059652983X
In that case...
You may want to wait for the 5th edition of UNIX and Linux System Administration, as it should release near the end of this year and they don't release new versions that often.
A good way to get started building a college library is to see what the curriculum for the school is and what books are required by professors. Often other colleges will list their book recommendations for the courses online to get an idea of where to start looking. (I know my school has an online bookstore that lists the books for each course and is open to the public)
At least one or two good books in each of those categories, to get a rough idea to start:
C, C++, Java, Python and Ruby are popular to start with
https://www.amazon.com/Advanced-Programming-UNIX-Environment-3rd/dp/0321637739
https://www.amazon.com/Programming-Paperback-Addison-Wesley-Microsoft-Technology/dp/0134382250
you already have a couple here
https://www.amazon.com/Artificial-Intelligence-Modern-Approach-3rd/dp/0136042597
https://www.amazon.com/Windows-Internals-Part-architecture-management/dp/0735684189 (coming soon)
Edit: On second thought, pretty much every college teaches system programming on linux - so perhaps just the linux texts would be adequate for that.
Not to dismiss the other book suggestions because they are also good but one of the most important, relevant, useful and famous books of all time about UNIX internal stuff is "Advanced Programming in the UNIX Environment" by Richard Stevens -- Amazon Link
It's not for the faint of heart and you'll need solid understanding of C-based languages... it's as gory as it can get. :)
Self-directed teaching has its limitations. For example, misreading or misunderstanding the system documentation. Debugging would have been less useful here because the program blows up after you make a system call -- a typical indication of programmer error. One tool you can use in such a situation is more documentation, especially one with additional examples and discussion. Take a look at Advanced Programming UNIX Environment, 3rd edition to get more information on system programming. It helps you build up a foundation and serves as a solid reference.
"Operating Systems" and "Software Tools and Systems Programming" were the most helpful to me. Both were difficult with difficult profs, but very interesting so I got a lot out of it. The Stevens' book was the text for "Software Tools" and all his books are very good.
In college I took a class that used this book as the text book. I loved that class and my knowlege and love of linux/unix definately benefited.
http://www.amazon.com/Programming-Environment-Addison-Wesley-Professional-Computing/dp/0321525949/ref=sr_1_1?ie=UTF8&qid=1334773536&sr=8-1
Read "The Linux Command Line" from cover to cover (it's free). You'll easily be a beginner shell scripter by then and probably a better Linux user overall. The book is also an easy read.
From there go into "Unix Shell Programming". If you reduce the gap between the 2 books, the 2nd book will also be an easy (yet somewhat dry) read.
Try to build some small projects while going thru the material. If you use it you'll be more apt to retain the info.
That's what I did. Took me 2 months of reading afterhours of my full time job. By the time the 2 months was up I surprisingly knew more shell scripting than most Linux Admins I've met since. (Admittedly, a lot of people in IT really don't know as much as they try to make it seem.) The only thing missing was experience and projects to use as practice.
Edit: You probably would do really well getting a LinuxAcademy subscription for a year and go thru as much as possible.
The best book I've run into on this front is http://www.amazon.com/Advanced-Programming-UNIX-Environment-3rd/dp/0321637739/ref=sr_1_1?s=books&ie=UTF8&qid=1453687799&sr=1-1&keywords=advanced+programming+in+the+unix+environment
Or,
for 877 pages. (WTF? UPE and ST are ~350 pages? I don't remember them being that long.)
i'd like to hear a comparison of this to Steven's http://www.amazon.com/Programming-Environment-Addison-Wesley-Professional-Computing/dp/0201433079 (2nd edition includes Linux) since that book is acknowledged to be a masterpiece.
Not as far as I know, but I've seen this book being recommended some times: http://www.amazon.com/Programming-POSIX-Threads-David-Butenhof/dp/0201633922/
I've never read it.
APUE is generally recommended (not specifically for multithreading though), and it has chapters on multithreading and multiprocess programming: http://www.amazon.com/Advanced-Programming-UNIX-Environment-Edition/dp/0321637739/
Obs.: People are talking about multithreading a lot, but there are other approaches. Multiprocess is another way to possibly take advantage of multiple cores on a CPU or multiple processors on a computer. Differences between the two approaches involve:
Processes are generally heavier weight (they spend more resources) and are more isolated from each other, in comparison to threads.
I have to say - Videos can't get into as much depth as books - they may feel more comfortable, but you're not learning as much.
That said, if you can tolerate books, start with a classic: The Unix Programming Environment. The coverage of system calls, in particular, will connect your userland knowledge with OS operations.
Oh wait, it's available online!
And Unix Systems Architecture is another classic that would be a great next step, but doesn't seem to be available online as a PDF ...
Well, there is The UNIX Programming Environment by Kernighan and Pike (K&P). It's a little dated but it covers sh and awk, including the use of grep, sed, lex, yacc, and the like. You might want to combine it with a more modern book to learn the latest enhancements to bash.
Cormen, Leiserson, Rivest, Stein
Russell, Norvig
Stevens
Mostly when he talks about the process/thread implementation and the process memory working set and page replacement algorithms. Also when he talks about the Unix security model (user|group|all). It is now a bit more elaborated than that, and you can use ACLs almost like in Windows. And at one point he asks when was the last time someone used pipes (|) for composing programs!
I would recommend this book, UNIX Internals: The New Frontiers, that explains the internal implementation of a variety of Unix systems in the mid nineties. Amazon says that a new edition is planned for January next year, good news!
I just started learning it for my class in University. I am surprised at how much I like it and how much deeper my understanding of Linux has got. It might be annoying at first but trust me, you learn a lot. You should also give Advanced Programming in the UNIX Environment a read. It has taught me so many things already!
>On a related note fuck tcsetpgrp.
Get yourself a copy of Advanced Programming in the Unix Environment, Second Edition. One of the few computer books I recommend reading.
It contains pretty concise (well, the book is big, but there's not much fluff) summaries of a lot of Unix systems stuff, including a lot of gotchas. Reading that earlier would have saved me a not insignificant amount of time on Unix systems later.
Sure, Programming with POSIX threads and Unix Network Programming, Volume 1.
You can install spacemacs and other custom configs as a way of discovering what's out there and how to do things, and then put the things you like and understand in your own
init.el
.This is a good book to get started: Writing GNU Emacs Extensions: Editor Customizations and Creations with Lisp.
Just go slow, try out lots of configs for ideas, build up your customizations over time.
Tools like this show you what the system is doing for the application. If you don't know what applications want to do, the output is going to be hard to understand. Perhaps work on some UNIX programming to see what UNIX looks like from an app's point of view?
http://www.amazon.com/gp/product/0321637739
I found this to be a useful starter.
https://www.amazon.com/dp/0201633922
Advanced Programming in the Unix Environment by Stevens Also the best book for everything else.
Many people may disagree with me, but as a Linux user on the younger side of the spectrum, I have to say there was one thing that really worked for me to finally switch for good- books.
There's tons of wikis and forums and of course Reddit to ask questions, but it is hard to get good answers. You may end up paying for books (unless you look on the internet for books) but it doesn't beat having a hard copy in front of you. It boils down to a time vs money trade off. The only wiki I would follow is one directly from the developers that act as documentation, not a community wiki. Also worth nothing certain wikis are more tied to linux and the kernel than others, meaning some are comparable/interchangable with the distro you may be using. Still, a novice would not easily put this together.
Forums are also useless unless you have the configuration mentioned in the post or that forum curates tutorials from a specific build they showcase and you as a user decided to build your system to their specifications. There's way too many variables trying to follow online guides, some of which may be out of date.
This i've realized is very true with things like Iommu grouping and PCI Passthrough for kernel based virtual machines. At that point you start modifying in your root directory, things like your kernel booting parameters and what drivers or hardware you're gonna bind or unbind from your system. While that does boil down to having the right hardware, you have to know what you're digging into your kernel for if you dont follow a guide with the same exact parts that are being passthrough or the cpus or chipsets are different.
Books are especially handy when you have a borked system, like you're in a bash prompt or an initramfs prompt or grub and need to get into a bootable part of the system. Linux takes practice. Sometimes its easier to page through a book than to search through forums.
Another thing about being an intermediate or expert Linux user is that you don't care much about distros or what other users or communities do. It wont matter as under the hood it's all the same, spare the desktop and the package managers. Once you're out of that mentality you just care about getting whatever you want done. I'm not one of those guys that's super gung-ho FOSS and open source. I just use what gets the job done. Also from a security perspective, yes Linux is in theory MORE secure but anything can be hardened or left vulnerable. It's more configuration tied than many uses and forums or threads lead it on to be.
My workload involves talking to servers and quite a bit of programming and scripting, in a variety of capacities. That's what led me to linux over the competitors, but I'm not so prudent to never ever want to use the competitor again or have a computer with it. With understanding Linux more, I use it more as a tool than to be part of the philosophy or community, though that enthusiasm pushes for new developments in the kernel.
I'm assuming you're a novice but comfortable enough in linux to get through certain things:
In any computer related thing, always TEST a deployment or feature first- From your linux system, use KVM or Virtualbox/vmware to spin up a few linux VMs, could even be a copy of your current image. This way any tweaks or things you want to test or try out is in an environment you can start over in.
The quickest way to "intermediate-expert" Linux IMO is learning system administration.
My go to book for this is "The Unix and Linux System Administration Handbook 5th edition"
https://www.amazon.com/UNIX-Linux-System-Administration-Handbook/dp/0134277554/ref=sr_1_1?keywords=The+Unix+and+Linux+System+Administration+Handbook+5th+edition&qid=1564448656&s=books&sr=1-1
This edition is updated recently to cover newer kernel features such as could environments and virtualization. This book also helps when learning BSD based stuff such as MacOS or FreeBSD.
Another good read for a "quick and dirty" understanding of Linux is "Linux Basics for Hackers" It does focus on a very niche distro and talks about tools that are not on all Linux systems BUT it does a good concise overview of intermediate things related to Linux (despite being called a beginners book).
https://www.amazon.com/Linux-Basics-Hackers-Networking-Scripting/dp/1593278551/ref=sr_1_3?crid=396AV036T1Y0Q&keywords=linux+basics+for+hackers&qid=1564448845&s=books&sprefix=linux+bas%2Cstripbooks%2C119&sr=1-3
There's also "How Linux works" but I cannot vouch for this book from personal use, I see it posted across various threads often. Never read this particular one myself.
https://www.amazon.com/How-Linux-Works-2nd-Superuser/dp/1593275676/ref=pd_bxgy_14_img_2/137-6604082-4373447?_encoding=UTF8&pd_rd_i=1593275676&pd_rd_r=feffef24-d3c3-400d-a807-24d8fa39cd1e&pd_rd_w=8GX0o&pd_rd_wg=3AMRB&pf_rd_p=a2006322-0bc0-4db9-a08e-d168c18ce6f0&pf_rd_r=WBQKPADCVSABMCMSRRA1&psc=1&refRID=WBQKPADCVSABMCMSRRA1
​
If you want a more programming oriented approach, if you're confortable with the C language, then you can always look at these books:
The Linux Programming Interface
https://www.amazon.com/Linux-Programming-Interface-System-Handbook/dp/1593272200/ref=zg_bs_3866_1?_encoding=UTF8&psc=1&refRID=5YN3316W22YQ4TSMM967
Unix Network Programming VOL 1.
https://www.amazon.com/Unix-Network-Programming-Sockets-Networking/dp/0131411551/ref=sr_1_1?keywords=Unix+Network+Programming+VOL+1.&qid=1564448362&s=books&sr=1-1
Advanced Programming in the Unix Environment
https://www.amazon.com/Advanced-Programming-UNIX-Environment-3rd/dp/0321637739/ref=zg_bs_3866_2?_encoding=UTF8&psc=1&refRID=5YN3316W22YQ4TSMM967
These books would take you to understanding the kernel level processes and make your own and modify your own system.
As many have mentioned, you can go into these things with "Linux from scratch" but it's also feasible to do Linux from scratch by copy/pasting commands. Unless you tinker and fail at certain things (hence do it on a vm before doing it to the main system) you won't learn properly. I think the sysadmin approach is "safer" of the two options but to each their own.
You don't need a school for this.
Low Level Programming Languages
For some Assembly
Software Reverse Engineering
Nostarch press/Wiley has books on this, plenty of defcon lectures. Watch 'Trolling with Math' as a way to defend against reverse engineering.
Operating System Theory
Also look up MIT classes 6.004 and 6.033 they cover all this in detail. Can find vids online of record lectures, open courseware assignments and lecture notes, ect.
Networking
Cellular and Mobile Communications
Discrete Math
Overview of Cyber Defense
Security Fundamental Principles (i.e., “First Principles”)
Above material covers this
Vulnerabilities
Legal
No idea
You should probably have a look at Peter Salus' A Quarter Century of Unix.
You'll want APUE 3rd Ed for something like this.
I personally consider it a must-have.
Other things to note, you may/may not want to setrlimit for core dumps if you have sensitive information in the daemon. Calling fork() and then killing the parent is considered standard as is calling setsid(), closing all file handles and opening 0/1/2 to /dev/null.
I just have a copy of Kernighan & Pike's Unix Programming Environment for my 1 year old. He seems to like it as much as the other books he has.
I'm making my way through A Quarter Century of Unix - it's very interesting.
As others have said, K&R is great for learning the C language. In addition to that, Algorithms in a Nutshell is a nice reference because it has sample code in C for a lot of major data structures and algorithms, so you can see how the language is used to implement CS concepts you might already be familiar with.
I would also highly recommend one or both of Advanced Programming in the Unix Environment or The Linux Programming Interface, which will get you up to speed on POSIX.
Geany might be a friendly alternative to VS. Otherwise GCC-G++ and make files are your friend. A decent book to read on how to utilize the power of Linux with c/c++ is Advanced Programming in the UNIX Environment :
https://www.amazon.com/Advanced-Programming-UNIX-Environment-3rd/dp/0321637739
It will teach you about headers you won't find on Windows and how to program the whole operating system using c. But this can always be extended to c++ since c++ is a superset of c.😂
A lot of Kernighan’s (co‐authored) books age surprisingly well. It’s a real testament to his writing style that they are still relevant today despite examples tending to be in PL/I or Fortran.
And, of course…
http://www.amazon.com/Power-Tools-Third-Shelley-Powers/dp/0596003307/ref=sr_1_1?ie=UTF8&qid=1304099248&sr=8-1
Reading something like UNIX Sys Admin Handbook couldn't hurt.
I've been a web developer for two years and can tell you what I learned over time that led to me getting an internship at a software company. I didn't major in computer science but I did eventually go to a bootcamp.
I'll note that I'm not a huge fan of that flowchart, because it's backwards. You need to be familiar with what all those tools can accomplish, but I don't think anybody is capable of holding expert-level competence in so many areas at the same time. The key is getting to the point where you know or can figure out what tool will be required for any given task. For example, I don't really know much about Websockets, but I know that I'd probably need them if I wanted to build a chat application.
Anyway, here's my learning track in terms of programming
Pre-2011: Excel formulas
First programming I ever did for a bunch of random things, and at this time I didn't realize I wanted to be in software development yet.
2011-2013: SQL
Started with the DBA where I was working sending me a Word document with some common queries I could run in a SQL client so I could answer other people's questions and same him time. Over time I learned how to change the queries and then write my own. This book helped: https://www.amazon.com/SQL-Queries-Mere-Mortals-Hands/dp/0321444434/ref=sr_1_2?ie=UTF8&qid=1494701750&sr=8-2&keywords=sql+queries+for+mere+mortals
2013-2014: Java, shell scripting, other unix/linux related things
Took a programming class using Java and a shell scripting class in a local university's online program. Used these books:
https://www.amazon.com/Java-Introduction-Problem-Solving-Programming/dp/0132162709/ref=sr_1_14?ie=UTF8&qid=1494701761&sr=8-14&keywords=introduction+to+programming+with+java
https://www.amazon.com/Unix-Shell-Programming-Stephen-Kochan/dp/0672324903/ref=sr_1_6?ie=UTF8&qid=1494701778&sr=8-6&keywords=unix+programming
I think Java is a very good first object oriented language to learn, even though most bootcamps want to do either Ruby or Javascript. Ruby (and Rails) have a little too much syntax sugar and other shortcuts that make it hard for a beginner to understand, and JavaScript is just plain weird (along with its ecosystem, which requires knowing a little history of the language and why it is the way it is).
2015: Ruby, Rails, a little JS. Attended a bootcamp and got my first job.
2016: ReactJS, actually understanding JS
2017: More JS, and now learning Elixir and the Phoenix framework.
As I mentioned before, these languages and frameworks are just tools. The way I've learned has been to do projects, figure out what tools would be necessary to accomplish all the functionality, and then slowly make progress on learning how to use those tools, eg, copy/pasting, modifying code other people have written, and then finally taking the training wheels off.
> Is there some sort of golden rule book whose laws must not be violated?
Yes. The Design of the UNIX operating system and there's The UNIX Programming Environment :\^)
If you're programming for POSIX environments, this book is an absolute reference. It's as old as pthreads, but still relevant, especially the explanation of various multi-threading paradigms, such as pipeline and worker group. Plus it's much better than OReilly's book on pthreads.
If you're developing for multiple platforms and want to stay 100% C++ /u/Meowiavelli 's recommendation is def. top notch.
Buy this book: <https://www.amazon.com/Unix-Shell-Programming-Stephen-Kochan/dp/0672324903&gt; and learn how the POSIX shell can make your life easier.
Just go straight to C++ then.
If not, http://shop.oreilly.com/product/9781565923065.do then https://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298 then https://faculty.washington.edu/jstraub/dsa/Master_2_7a.pdf
I haven't read the last one, but I skimmed through it. You need that.
Hmm, what next? Ah, https://www.amazon.com/Advanced-Programming-UNIX-Environment-3rd/dp/0321637739 if that's your thing. You may find that online without having to buy it for the 2nd edition.
Oh, sockets... http://www.csd.uoc.gr/~hy556/material/tutorials/cs556-3rd-tutorial.pdf however, back when I studied those, I read beej's tutorial: http://beej.us/guide/bgnet/
You obviously don't need all of that. The first book I listed is enough, but maybe it'll be fun to work through them?
First note that Career/Job/Market is quite different from Knowledge/Intellectual satisfaction. So you have to keep "earning money" separate from "gaining knowledge" but do both parallely. If you are one of the lucky few who has both aligned in a particular job, you have got it made. Mostly that is never the case and hence you have to work on your Motivation/Enthusiasm and keep hammering away at the difficult subjects. There are no shortcuts :-)
I prefer Books to the Internet for study since they are more coherent and less distracting, allowing you to focus better on a subject. Unless newer editions are reqd. buy used/older editions to save money and build a large library. So here is a selection from my library (in no particular order);
First, you need to learn
cd
ls
. And the UNIX filesystem. Here is a PDF for the filesystem. You need to know this: http://www.pathname.com/fhs/pub/fhs-2.3.pdfcd
is a shell command, not a program. It changes your current working directory. This is what you use like Windows Explorer or OS X Finder. When you login, you will start at /home/USERNAME. To see all of the users on the system's home directories do:cd ..
ls
Odds are there aren't many users besides you. If you login as root (not advised, especially at first). Root's home directory is /root.
Some things to learn are how a Linux system starts. Unfortunately if you are using a newer Debian 8, it uses systemd which is much a much more complex booting system than previous versions. Honestly, I would recommend installing Debian 7 and learn how it starts, then move to Debian 8. systemd is new and a bit controversial because it is not very "unixy".
The reason I mention systemd, is that it is the first "user space" process that runs when linux starts. The older mechanism is called init.
The reason that I say go with the older system is because it uses a series of shell scripts which is a text file filled with various commands to get things started. This is a good place to learn how things are done when starting out. systemd is a very big and complex system that I believe is too complicated to start with, but it's good to learn eventually.
If all this is too much at first, install a very base system. Then go to /usr/bin and read the man page for each command. To read a man page, do
man COMMAND_NAME
. Sometimes, you may need to doman 1 COMMAND_NAME
as the /usr/bin/ commands are in section 1 of the UNIX manual. To quit viewing the page, pressq
. You can use the up and down arrows and space to navigate like a web page. You can also usej
for down andk
to go up.I would also suggest a book. I started out with http://www.amazon.com/UNIX-Impatient-Edition-Paul-Abrahams/dp/0201823764 It's $20 or so dollars. If you don't have the money, PM me and I'll buy it for you.
Learn the shell. Bash is a good enough one. zsh is very cool as well.
Oh, it's probably worth noting that UNIX is a multi user system, where root is "God" of the system. Root can do basically anything, and the other users have less permissions to do things. I would recommend using a real user at first, to learn the differences.
Linux is really fun. It has a very steep learning curve because it is so complex and powerful, and that power is why it has been #1 is doing stuff like powering the internet, being used for wifi routers, and it is the basis of over 90% of all cellphones as well. UNIX has evolved to be basically Linux nowadays. There are some commercial UNIXes left, but Linux is good enough.
Keep posting here if
There is an updated second edition.
Learning the vi and vim editors
vim Adventures
/r/vim
vim Golf
ok, is this book is good to master bash ?
It will teach you the semantics of the posix interface and introduce you to some canonical utilities. That information is relevant today (we still use sed, make, etc..). Given the choice, I'd probably opt for a book specific to linux, freebsd, etc.. kernels alongside something like unix power tools.
I enjoy reading shell scripts. This was an interesting premise for a blog but a bit light.
I'd recommend:
http://www.tldp.org/LDP/abs/html/
http://www.amazon.com/Unix-Shell-Programming-Stephen-Kochan/dp/0672324903/ref=sr_1_16?s=books&amp;ie=UTF8&amp;qid=1376482562&amp;sr=1-16&amp;keywords=shell+script+programming
UNIX Shells by Example by Ellie Quigley is a great text to pick up shell scripting.
While being a self taught sys admin is great, learning the internals of how things work can really extend your knowledge beyond what you may have considered possible. This starts to get more into the CS portion of things, but who cares. It's still great stuff to know, and if you know this you will really be set apart. Im not sure if it will help you directly as a sys admin, but may quench your thirst. Im both a programmer and unix admin, so I tend to like both. I own or have owned most of these and enjoy them greatly. You may also consider renting them or just downloading them. I can say that knowing how thing operate internally is great, it fills in a lot of holes.
OS Internals
While you obviously are successful at the running and maintaining of unix like systems. How much do you know about their internal functions? While reading source code is the best method, some great books will save you many hours of time and will be a bit more enjoyable. These books are Amazing
The Design and Implementation of the FreeBSD Operating System
Linux Kernel Development
Advanced Programming in the UNIX Environment
Networking
Learning the actual function of networking at the code level is really interesting. Theres a whole other world below implementation. You likely know a lot of this.
Computer Networks
TCP/IP Illustrated, Vol. 1: The Protocols
Unix Network Programming, Volume 1: The Sockets Networking API
Compilers/Low Level computer Function
Knowing how a computer actually works, from electricity, to EE principles , through assembly to compilers may also interest you.
Code: The Hidden Language of Computer Hardware and Software
Computer Systems: A Programmer's Perspective
Compilers: Principles, Techniques, and Tools
This book is full of unix and linux tips. I suggest this book over all others I've read. It is an immense help for daily tasks as well as stuff you don't see too often.
http://www.amazon.com/UNIX-System-Administration-Handbook-3rd/dp/0130206016
Assuming you're using Linux/Unix/BSD, this book will be invaluable: http://www.amazon.com/Advanced-Programming-UNIX-Environment-Edition/dp/0321637739
To start with, read up on select(), as that will be your friend. Doing something like this will be really tricky to get right.
Here's the one I was thinking of: http://www.amazon.com/Unix-Power-Tools-Third-Edition/dp/0596003307
You don't need the book, but I like learning from practical examples and then using that as a jumping off point. If you like starting with examples for learning - this is the book for you.
http://www.amazon.com/UNIX-Internals-The-New-Frontiers/dp/0131019082
I'm surprised this one hasn't been mentioned yet; it's arguably one of the best book on UNIX operating systems design. It gives a lot of valuable information on how to efficiently implement SMP kernels which is something missing from a lot of other books. Maybe not adequate if you're a complete beginner though.
Same problem here. No idea on how to fix, unfortunately. I grabbed the O'Reilly book, then played vimgolf religiously for a couple weeks, then forced myself to use vim as my only IDE/text editor for a month, and now it feels more natural to me than any other editor I've used.
If you're looking for a book I highly recommend Unix Shells by Example:
http://www.amazon.com/UNIX-Shells-Example-4th-Edition/dp/013147572X/ref=la_B001H9RV1E_1_2?ie=UTF8&amp;qid=1346897356&amp;sr=1-2
I like it because it's light on the banter and explanation that's so common with tech books, and heavy on the examples. It's had a permanent spot on my work bookshelf for the last 10 years
> can someone give me a few suggestions of things to read up on in terms of linux shop debug workflow?
This book shows why some programmers love emacs so much:
http://www.amazon.com/Writing-GNU-Emacs-Extensions-Customizations-ebook/dp/B0043M56SW/ref=sr_1_2?ie=UTF8&amp;qid=1427123072&amp;sr=8-2&amp;keywords=emacs+lisp
The info pages for gdb are good and there's plenty of websites giving short tutorials on how to debug with it.
This book is good for make:
http://www.amazon.com/Managing-Projects-Make-Nutshell-Handbooks/dp/0596006101/ref=sr_1_1?ie=UTF8&amp;qid=1427123212&amp;sr=8-1&amp;keywords=make+oreilly
So, this was a thought frequently at the back of my mind, but I never did bother to investigate why the fuck O'Reilly uses pencil sketches of ugly animals as their book covers.
So I went to their website, and a few things stuck out to me.
>And, as I investigated the attributes of the real animals, I quickly discovered that there were intriguing correspondences between specific technologies and specific animals. That resonance grew and expanded as I learned more about both the technologies and the animals.
>I was so energized and inspired that I spent an entire weekend working on the covers without much sleep.
>At the end of the weekend, I gave several sketches to my neighbor to take into the office.
Here you go: Advanced Programming UNIX Environment Edition.
UNIX Shells by Example by Ellie Quigley. Reviews here.
Advanced Programming in the Unix Environment (https://www.amazon.com/gp/product/B00DB3G8KY/) is also great, though not Linux specific, more traditional Unix APIs
Advanced Programming in the UNIX Environment, 3rd Edition
https://www.amazon.com/Advanced-Programming-UNIX-Environment-3rd/dp/0321637739
"Created its own problem"? The problem is documented in detail in two Unix operating systems books, as explained in the blog post. We didn't create the problem -- this problem is fundamental to how Unix works, and using Docker doesn't suddenly make it go away.
If you don't believe me, go read Operating Systems Concepts by Silberschatz et al, or Advanced Programming in the UNIX Environment by Stevens et al. Look up what they have to say about PID 1 and zombie processes.
Heck, even Solomon Shykes, founder of Docker inc, recognizes this problem. But it pains me that I have to appeal to authority even though the facts are out there.
You should not look the source code of the libs if you want to learn how C works, their code it's full of complex concepts of C programming like a lot of preprocessor, abstract structures and complex algorithms (dynamic programming, divide and conquer, backtracking, etc).
If you don't know how UNIX programming works you should start there, like process control, file and dir management, threading, networking. A lot more useful to learn pure C than the standard libs implementations.
For UNIX programming read this: Stevens
To improve your knowledge in C: K&R and as a complement king.
If you insist in reading library implementation take a look at OpenBSD libs implementation (much clutter-less than GNU).
Oh, and also do yourself a big favor and learn Vim reading learning vim.
Knowing the basics of C language and UNIX programming is the way to become a true programmer/hacker.
These books, third one optional are a great start to be a freedomm-beard / community troll like myself. I can't say its a glorious life but it pays the bills. Being able to throw together a cluster of computers for some interesting distributed database / model crunching is pretty damn cool. I would also suggest a copy of virtualbox and ubuntu for a beginner's linux desktop and debian for servers. Freebsd is pretty dame great, and cent/rhel is not a bad place to go either. Its also unix with a U not eunuch with an e.
http://www.amazon.com/Linux-Administration-Handbook-Evi-Nemeth/dp/0130084662
http://www.amazon.com/Practical-Guide-Commands-Editors-Programming/dp/0131367366/ref=pd_sim_b_2
http://www.amazon.com/Learning-Vim-Editors-Arnold-Robbins/dp/059652983X/ref=pd_sim_b_23
I understand this is not so much a scientist bit of content here, but having systems competency if you plan on doing research that does any model analysis is pretty valuable.