How does a C program using popen(3) to interact with system compare with bash shell?

http://stackoverflow.com –
Are there any limitations using a C 'shell emulator' in this way for a user to send commands to the kernel (in linux)? As an afterthought question, if you set a user to not have shell access, what stops them using something like this to interact with the kernel? (by say running the program from shell_exec via php)?
(by restricting the user, I mean in /etc/passwd)
Thanks
(HowTos)