Ваш скрипт logtest.sh записывает только в log и немедленно закрывает дескриптор файла. Поэтому, когда вы вызываете fuser на log.1, процесс не имеет активного файлового дескриптора для этого файла.
Вы можете имитировать это, запустив цикл while внутри list [ ! d1]
(while true; do echo $(date); sleep 1; done) >> log
И оба logtest.sh и logtest.c прекратятся независимо от того, какую SIGNAL вы отправляете, потому что вы не обрабатываете сигнал. С помощью bash это можно сделать с помощью trap '<COMMAND>' USR1 (посмотрите man bash-builtins). Но я не знаю, как это делается на C (никогда не было C).