Нужно понимать два момента
команды jobs, bg и fg являются внутренними командами шелла, и работают с дочерними процессами именно этого шелла.
Если вы приостановили дочерний процесс (Ctrl-Z) или запустили его сразу в бэкраунда (ping google.com &), то командой fg вы выводите его на передний план. Это все равно что в винде вы взяли и поставили мышкой фокус на окне блокнота, после чего нажимая клавиши вы будете писать в этом блокноте.
А если вы приостановили процесс Ctrl-Z и продолжили его через bg, он будет продолжаться в фоне, а на переднем плане будет ваш шелл - вы можете писать другие команды. Все равно что мышкой в винде вы кликнули в рабочий стол рядом с блокнотом, и поэтому нажимая клавиши вы будете писать не в блокноте а на рабочем столе (стрелки по иконкам бегают, какие-то хоткеи могут работать, Enter запустит текущую иконку)
Для понимания потренируйтесь так:
sleep 100
CTRL-Z
jobs
bg 1
echo I am still in shell
fg 1
CTRL+C
И второй момент - можно запустить программу в фоне, и отсоединить ее от текущего шелла вообще (запустить ее через nohup sleep 100 & и отключитья от сессии, или выполнить
sleep 100 &
jobs
disown
jobs
ps aux | grep sleep
в этом случае bg/fg уже не помогут, так как программа запущенная в фоне уже имеет другого родителя, и не подконтрольна внутренним bg/fg - вернуть ее как дочерний процесс под текущий шелл уже не выйдет.
Поэтому Ctrl+C, Ctrl+Z - это просто сигнал который ты отправляешь в текущий "foreground" процесс, с которым ассоциирован stdin