fork系统调用:
pid_t fork(void);
一个成功的fork调用将促使内核创建一个新的进程,该进程是调用进程的一个精确副本。
pid = fork();
其中的pid可以用来区分父进程和子进程。在父进程中,pid被设置为一个非零的正整数,而在子进程中被设置为零。返回到父进程的pid值,称为子进程的进程id。
这段程序创建两个子进程,每个子进程再创建一个它们自己的子进程。在每个fork之后,每个父进程打印其后代进程的进程id。
使用exec运行新程序:
所有exec函数族都完成同一功能:装载一个新的程序,并将之转换到调用进程的内存空间。如果调用成功,调用程序将被新的程序覆盖,并且从新程序的起始处开始运行,并保持与原调用进程相同的进程id。
本例中,在成功调用execl之后,调用进程被覆盖,所以就不执行perror,由此可知,当execl和相关调用返回时,它们通常返回-1。
将exec和fork一起使用:
fork调用之后,父进程执行wait系统调用,导致A进程挂起直到B进程终止。
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 " );
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 " );
使用exec运行新程序:
所有exec函数族都完成同一功能:装载一个新的程序,并将之转换到调用进程的内存空间。如果调用成功,调用程序将被新的程序覆盖,并且从新程序的起始处开始运行,并保持与原调用进程相同的进程id。
printf(
"
executing ls
"
);
execl( " /bin/ls " , " ls " , " -1 " ,( char * ) 0 );
perror( " execl failed to run ls " );
exit( 1 );
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;
}
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;
}