Ваша программа завершает работу сразу после создания потока, потому что вы не ждете, пока поток завершит sh.
Добавьте это где-нибудь до того, как main()
вернет:
void* retval;
int r = pthread_join(threads, &retval);
if(r==0) // successfully joined the thread threads
else // failed to join the thread threads