At lunch, Sri Lanka were 108-3, taking their overall lead to 247 runs with seven wickets in hand.
Kumar Sangakkara was batting on 38 with five fours along with skipper Angelo Mathews on 14 at the break.
Sri Lanka had scored 421 in their first innings before bowling out the Proteas for 282 to take a 139-run first innings lead.
After resuming at the overnight 11-0, Sri Lanka added a healthy 97 runs in the session while losing their openers and the prolific Mahela Jayawardene.
Kaushal Silva welcomed leg-spinner Imran Tahir (1-32) with a neat sweep to the fence in the bowler's first over, setting the tone for the rest of the session that saw the hosts score at a quick pace.
Silva had made 26 when he scooped a drive, offering an easy catch to Vernon Philander at point off Morne Morkel (1-15).
Jayawardene, who cracked a solid 165 in the first innings, was out for a duck in a bizarre fashion off Tahir.
Jayawardene was given out but he sought a review believing that the ball had not touched his glove. However, the decision of the on-field umpire was upheld and the batsman walked away shaking his head in disappointment.
South Africa lead the series 1-0 after winning the opening Test in Galle by 153 runs.
