I think that you have misunderstood what execv does. Execv, and it's sibblings do not spawn new processes to run the program that you tell them to run, they replaces the calling program with the one you want to run. This means that if you do the following:
..
...
execv("new_program", NULL);
printf("finished"

;
Your program will _never_ reach the printf-line. So to do what you want, you normally fork (wich does return the pid of the child to the parent) and if you are the child you exec the program you want. You now have two processes, the first one running your original program and a second one running the program that you want, plus you have the pid to the second program.
Just as stated in the man-pages for exec and fork.
From man 2 exec:
"The exec family of functions replaces the current process image with a new process image."
From man 2 fork:
"On success, the PID of the child process is returned in the parent's thread of execution, and a 0 is returned in the child's thread of execution."
So if you do the following:
int pid;
if ((pid = fork) == 0) {
/* I am child!! */
execv("another_program", NULL);
printf("This row will never be executed!!\n"

;
} else {
/* I am parent, kill the newly spawned child. */
sleep(5); /* wait for five seconds */
kill(pid, SIGINT);
}
you will actually start a new process, both the parent and child process will continue on the exact same instruction in two exact copies of code, one will get 0 from fork (the child) and the other (parent) will get the pid of the newly created child.
Isn't this what you wanted?