Reading's Ali Al-Habsi made an early save after Lukas Jutkiewicz had got on the end of David Cotterill's free-kick.
Michael Morrison went close for Birmingham before Jutkiewicz was again thwarted by Al-Habsi in the first half.
Diego Fabbrini fired just wide for Birmingham in the 90th minute before team-mate David Davis missed the target in the second minute of stoppage time.
The result means Birmingham drop a place to fifth in the Championship table, while Reading go up one spot to 10th.
Reading manager Jaap Stam: "It wasn't easy because you play against a top side who are dropping deep to prevent us [having] the space to pass the ball through to play.
"If you play against a team who is playing that, you need to be very consistent in what you're doing. You need to play at a very high pace.
"Sometimes in the first half, we didn't do that. We were impatient. Because we wanted to go forward, sometimes you take a lot of risks and you pass the ball too quick.
"We had a lot of possession and we should have created more chances. But at least we got a clean sheet and a point."
Birmingham manager Gary Rowett: "We're resolute, we're a tough team and a hard team to play against. I'm trying to improve our shots on goal, our goalscoring record and the quality of crosses into the box.
"We weren't quite there tonight but again we showed that we can dig in, we can make blocks, we can make tackles and we can keep clean sheets.
"I'll sometimes take that away from home because it's the hallmark of a pretty resolute team."
Match ends, Reading 0, Birmingham City 0.
Second Half ends, Reading 0, Birmingham City 0.
Attempt missed. David Davis (Birmingham City) right footed shot from outside the box misses to the left. Assisted by Maikel Kieftenbeld.
Attempt missed. John Swift (Reading) right footed shot from outside the box is high and wide to the right. Assisted by Yann Kermorgant.
Offside, Reading. John Swift tries a through ball, but Joseph Mendes is caught offside.
Substitution, Reading. Joseph Mendes replaces Roy Beerens.
Foul by George Evans (Reading).
Diego Fabbrini (Birmingham City) wins a free kick in the defensive half.
Substitution, Reading. Callum Harriott replaces Garath McCleary.
Substitution, Birmingham City. Diego Fabbrini replaces Che Adams.
Foul by Garath McCleary (Reading).
David Davis (Birmingham City) wins a free kick in the attacking half.
Corner,  Reading. Conceded by Jonathan Grounds.
Liam Moore (Reading) wins a free kick in the defensive half.
Foul by Che Adams (Birmingham City).
Substitution, Birmingham City. Clayton Donaldson replaces Lukas Jutkiewicz.
Attempt blocked. Jacques Maghoma (Birmingham City) right footed shot from outside the box is blocked.
Substitution, Reading. John Swift replaces Stephen Quinn.
Corner,  Reading. Conceded by David Davis.
Attempt saved. Lukas Jutkiewicz (Birmingham City) header from the centre of the box is saved in the centre of the goal. Assisted by David Cotterill with a cross.
Corner,  Reading. Conceded by Michael Morrison.
Substitution, Birmingham City. Jacques Maghoma replaces Robert Tesche.
Corner,  Reading. Conceded by Robert Tesche.
Stephen Quinn (Reading) wins a free kick in the attacking half.
Foul by Maikel Kieftenbeld (Birmingham City).
Attempt blocked. Stephen Quinn (Reading) left footed shot from outside the box is blocked.
Attempt missed. Paul McShane (Reading) header from the centre of the box misses to the right. Assisted by Garath McCleary with a cross following a corner.
Corner,  Reading. Conceded by Maikel Kieftenbeld.
Attempt blocked. Jordan Obita (Reading) left footed shot from outside the box is blocked.
Corner,  Reading. Conceded by Robert Tesche.
Attempt blocked. Danny Williams (Reading) header from the centre of the box is blocked. Assisted by Chris Gunter with a cross.
Corner,  Reading. Conceded by Michael Morrison.
Attempt blocked. Danny Williams (Reading) right footed shot from outside the box is blocked. Assisted by Yann Kermorgant with a headed pass.
Foul by Paul McShane (Reading).
Che Adams (Birmingham City) wins a free kick in the defensive half.
Attempt missed. David Davis (Birmingham City) right footed shot from the centre of the box is too high.
Attempt saved. Maikel Kieftenbeld (Birmingham City) right footed shot from outside the box is saved in the centre of the goal. Assisted by David Cotterill.
Corner,  Birmingham City. Conceded by George Evans.
Attempt blocked. Lukas Jutkiewicz (Birmingham City) header from the centre of the box is blocked. Assisted by David Cotterill with a cross.
Corner,  Birmingham City. Conceded by Paul McShane.
Reading stretched their unbeaten run to five games in all competitions after being held by high-flying Birmingham.