InterviewQuestions
I thought it might be useful to collect some of the questions I or my friends have been asked over the years. I've had a number of jobs in the computer industry with the side effect that I've been to a lot of interviews. Obviously these are all centered around Linux System Administration since that's my profession.
So to dive right in, here are some questions I remember:
*Name the three packets exchanged in the setup of a TCP connection. Followup: name the three packets exchanged when a client closes a TCP connection.
Answer: SYN, SYN/ACK, SYN Followup: FIN, ACK, FIN, ACK
*Three times are kept for every unix file. What are they?
Answer: atime, ctime, and mtime. The atime is the access time, i.e. the last time the file was read. ctime seems like it should be the creation time, but it isn't. In fact, there is no way to determine when a file was created in Unix. ctime stands for change time, and it is a record of the last time the file's inode was changed. This happens for example when the permissions or ownership on the file are modified.
Finally, the mtime is the time the file was modified, i.e. when the actual file was written to.
*How many computers can you put on a /17 network?
Interviewers love these sorts of questions. I personally hate them, but maybe that's just me. The answer to this particular question is 32766. The quick formula is (2^(32-17))-2, i.e. subtract the cidr # from 32, raise 2 to that power, and subtract 2. Why subtract 2? Because all 0s and all 1s are not valid system addresses. All 1s is the broadcast address. All 0s is technically a valid address, but for historical reasons you can't use it. Thus for any address range you always have to subtract 2 entries to get the number of usable addresses.
A followup question is what is the netmask? Answer: 255.255.128.0. To calculate, observe that in binary a /17 cidr can be written as:
11111111 11111111 10000000 00000000
the first two octets are 255 (all ones). The last is 0 (all zeros). Thus the only one you need to convert to decimal is 10000000. To do this, dust off your binary knowledge:
10000000 = (0x2^0) + (0x2^1) + (0x2^2) + (0X2^3) + (0x2^4) + (0x2^5) + (0x2^6) + (1x2^7)
2^7 is 128, so it's 0+0+0+0+0+0+0+128 = 128. The netmask is therefore 255.255.128.0.
I suspect there's an easier way to do that.
*What's an inode? Followup: what key piece of information about a file is not stored in the inode?
An inode is the on-disk data structure that describes a file and contains key information such as owner and permission. The answer to the followup is the filename - that is stored in the directory. Followup to followup: this also explains the difference between ctime and mtime.
*What's the first startup script executed on a Fedora system?
Answer: /etc/rc.d/rc.sysinit
*Put the following operations in order from slowest to fastest: read cpu register, disk seek, read from main memory, write to pci bus.
Answer: disk seek, write to pci bus, read from main memory, read cpu register
*Compare the output of two processes using diff. Don't use temporary files.
Answer: use NamedPipesInBash, i.e.:
# diff <(process one) <(process two)
(this one is kind of extra credit)
- What does the sticky bit do when applied to a file? A directory?
- Describe RAID levels 0,1,5, and 0+1. What's the difference between 0+1 and 1+0?
- What's the difference between
my
andlocal
in perl? Give examples of usage of both. - Write a script that takes an input word and a corpus of text, and finds all anagrams of the input word in the text.
A pretty good way to do this in perl is to read the input line by line. Then break each line into words by word boundary (\b). Alphabetize the letters of the imput word and each word in the line. If they are a match, you've found an anagram.
- What are the three fundamental data types in Perl?
array, hash, scalar
- Define a zombie process. Followup: when and why does init become the parent of a process?
A process becomes a zombie when it's parent exits without calling wait(). If parent dies before child, init (PID 1) becomes parent of such child. This is necessary to reclaim process state after child exits.
- In bash, what variable contains the exit status of the last executed process?
$?