В зависимости от того, что вы хотите сделать с файлом, и если для вас приемлемы относительно недавние добавления в POSIX.1-2008, openat
и друзья могут представлять интерес:
int dirfd = open(desired_cwd_path, O_RDONLY);
int fd = openat(dirfd, file_relpath, O_RDONLY);
close(dirfd);
// ...use fd
(Эти системные вызовы существовали, например, в Solaris и Linux уже довольно давно.)