linux多进程的总结(fork用法)



原创:lobbve223  出自: http://www.linuxdiyf.com


复杂理解理会为,一个进程表示的,便是一个可执行程序的一次执行进程中的一个形状。操作体系对进程的解决,典型的环境,是议决进程表完成的。进程表中的每一个表项,记载的是此后操作体系中一个进程的环境。关于单 CPU的环境而言,每一特定时辰只要一个进程占用 CPU,然则体系中可以梗概同时存在多个活动的(守候执行或继续执行的)进程。

fork()用于从已存进程中树立一个新进程,新进程为子进程,老进程为父进程.可以议决反省"fork()"地前往值晓得哪个是子进程哪个是父进程。父进程取得的前往值是子进程的进程号,而子进程则前往0。

基本情势是:

#include
#include
#include
#include
#include
#include
main()
{
pid_t pid;
int rv;
pid=fork(); //创立进程
switch(pid)
{
case -1: //前往-1的话,进程创立没乐成
perror("fork");
exit(1);
case 0:
printf(" CHILD: This is the child process!\n");
printf(" CHILD: My PID is %d\n", getpid()); //调用 getpid 取得本身的 PID
printf(" CHILD: My parent's PID is %d\n", getppid()); //getppid() 取得父进程的 PID
printf(" CHILD: Enter my exit status (make it small): ");
scanf(" %d", &rv);
printf(" CHILD: I'm outta here!\n");
exit(rv);
default:
printf("PARENT: This is the parent process!\n");
printf("PARENT: My PID is %d\n", getpid());
printf("PARENT: My child's PID is %d\n", pid); //fork() 前往的default值意味着你正在父进程中,前往值是子进程的 PID 。这是取得子进程 PID 的独一办法
printf("PARENT: I'm now waiting for my child to exit()...\n");
wait(&rv); //父进程必需守候子进程完成收拾子进程的剩余后才气继续
printf("PARENT: My child's exit status is: %d\n", WEXITSTATUS(rv)); 也便是父进程不能先于子进程消亡。
printf("PARENT: I'm outta here!\n");
}
}
//EXITSTATUS() 是一个宏,从 wait() 前往值中提取实践的前往值。
// wait() 如何晓得在哪个进程上守候?我的意思是,由于父进程可以有多个子进程, wait() 实践守候地是哪一个?答案极度复杂,它守候起头列入的那一个。你可以议决以子进程的 PID 为参数调用 waitpid() 指明是哪一个子进程。

if (!fork())
{
printf("I'm the child!\n");
exit(0);
} else
{
printf("I'm the parent!\n");
wait(NULL);
}

linux 是多用户和多进程的操作体系,进程在操作体系中的创立,都会天生一个进程描写块,描写此后进程的所有信息,包罗,数据段、代码段、仓库段的地点,此后进程的环境变量,文件描写符等。

fork函数进程:操作体系先创立一个进程描写块,然后把父进程的所有进程描写符的信息正确拷贝过去,和父进程一样(除了进程ID纷比方样外),代码段共享,数据段和仓库段复制,所有的寄放器的值所有正确拷贝,文件描写符也许正确拷贝。

fork的前往值,fork在父进程空间中前往子进程的PID,在子进程空间中前往0。




版权声明: 原创作品,准许转载,转载时请务必以超链接情势标明文章 原始出处 、作者信息和本声明。不然将穷究功令责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1976016.html