fork系统调用:
pid_t fork(void);
一个成功的fork调用将促使内核创建一个新的进程,该进程是调用进程的一个精确副本。
pid = fork();
其中的pid可以用来区分父进程和子进程。在父进程中,pid被设置为一个非零的正整数,而在子进程中被设置为零。返回到父进程的pid值,称为子进程的进程id。
pid_t pid;
pid_t cid,did;
printf("Just One process so far ");
printf("Calling fork... ");
pid = fork();

if(pid == 0)...{
printf("I'm the child. ");
cid = fork();
if(cid > 0) printf("grandson1 id = %d. ",cid);
if(cid == 0) printf("I'm the grandson1 process ");
}

else if(pid > 0) ...{
printf("I'm the parent ,child has pid %d ",pid);
did = fork();
if(did > 0) printf("grandson2 id = %d. ",cid);
if(did == 0) printf("I'm the grandson2 process ");
}
else printf("Fork returned erro code,no child ");
这段程序创建两个子进程,每个子进程再创建一个它们自己的子进程。在每个fork之后,每个父进程打印其后代进程的进程id。
使用exec运行新程序:
所有exec函数族都完成同一功能:装载一个新的程序,并将之转换到调用进程的内存空间。如果调用成功,调用程序将被新的程序覆盖,并且从新程序的起始处开始运行,并保持与原调用进程相同的进程id。
printf("executing ls ");
execl("/bin/ls","ls","-1",(char*)0);
perror("execl failed to run ls");
exit(1);
本例中,在成功调用execl之后,调用进程被覆盖,所以就不执行perror,由此可知,当execl和相关调用返回时,它们通常返回-1。
将exec和fork一起使用:
pid_t pid;

switch(pid=fork())...{
case -1:
fatal("fork failed");
break;
case 0:
execl("/bin/ls","ls","-1",(char*)0);
fatal("exec failed");
break;
default:
wait((int*)0);
printf("is completed ");
break;
}
fork调用之后,父进程执行wait系统调用,导致A进程挂起直到B进程终止。
pid_t fork(void);
一个成功的fork调用将促使内核创建一个新的进程,该进程是调用进程的一个精确副本。
pid = fork();
其中的pid可以用来区分父进程和子进程。在父进程中,pid被设置为一个非零的正整数,而在子进程中被设置为零。返回到父进程的pid值,称为子进程的进程id。

























使用exec运行新程序:
所有exec函数族都完成同一功能:装载一个新的程序,并将之转换到调用进程的内存空间。如果调用成功,调用程序将被新的程序覆盖,并且从新程序的起始处开始运行,并保持与原调用进程相同的进程id。




本例中,在成功调用execl之后,调用进程被覆盖,所以就不执行perror,由此可知,当execl和相关调用返回时,它们通常返回-1。
将exec和fork一起使用:















