赞
踩
在学习linux进程编程之前,我们首先要知道什么程序,什么事进程。
当我们写完代码编译完生成的可执行文件,叫做程序,而打开这个程序去运行他,这是这个东西就变成了进程。
程序是一个静态的概念,进程是一个动态的概念!
在进程中,又分别有父进程和子进程。父进程是创造了子进程。子进程拥有和父进程一样的资源的数据。但是他们的存储空间不一样。
fork()函数,是创造进程。他的特征是调用会产生两次返回值。父进程调用返回新进程的ID。
getpid():这个是查询当前进程的ID。getppid()是查询当前进程的父进程的ID;
下面代码展示应用:
第一个:getpid();
int main()
{
pid_t pid;
pid = getpid();
printf("my pid is %d\n",pid);
while(1);
return 0;
}
这里就一个进程,getpid()查询后得到当前进程pid。
第二个代码:
int main()
{
pid_t pid;
pid = getpid();
fork();
printf("my pid is %d current %d\n",pid,getpid());
return 0;
}
大家会看到这里代码运行结果打印了两遍。第一遍的pid是一样的,但是第二遍的pid是不一样的。这就出现了问题。
因为在开始定义pid = getpid()之前已经有一个进程运行了,fork()有创建了又一个进程,这个进程叫做子进程。这时候父进程开始运行,所以在printf中的getpid()得到的是父进程的pid。父进程运行后,子进程又开始运行,因为子进程和父进程有一样的数据,所以printf的pid就是原来父进程的pid,但是这时是子进程在运行,所以getpid()得到的结果就是子进程的pid,所以第二个打印pid不一样。
第三个代码:
int main()
{
pid_t pid;
pid_t pid2;
pid = getpid();
fork();
pid2 = getpid();
if(pid == pid2)
{
printf("this is father process\n");
}
else{
printf("this is child print,child pid = %d\n",getpid());
}
return 0;
}
fork()调用之前,getpid()得到的原进程的pid,当fork()创建以后,子进程出现。这是两个进程开始分别运行,父进程先运行。 这时候得到的pid2是是父进程pid,后面pid=pid2,所以打印第一个。但是当子进程运行时,pid2得到是子进程pid,所以这个时候的pid!=pid2.所以打印第二个。
第四个代码:
int main()
{
pid_t pid;
pid = fork();
printf("%d\n",pid);
printf("%d\n",getpid());
if(pid>0)
{
printf("this is father process %d\n",getpid());
}
else if{
printf("this is child print,child pid = %d\n",getpid());
}
return 0;
}
首先,fork的调用产生了新的进程,返回新进程的pid。所以第一个打印是新进程的pid。但是父进程开始运行,所以第二个getpid()得到的是父进程的pid,所以打印的是父进程的pid。这个pid是大于0的所以执行if,打印第三行结果,getpid()得到的也是父进程的pid,因为这个过程始终是父进程在运行。第二个是子进程开始运行,因为子进程调用fork()返回值是0,所以第四行打印的是0,这个时候到结束都是子进程在运行,所以这个时候是得到的是子进程的pid。
总结:子进程和父进程是一摸一样的,但是谁生了生谁就是谁的baba,他们有一样的数据,但存储空间不一样。在程序中就像有两个人,一个人干一遍,另一个人也要干一遍,就是说父进程执行一遍代码,子进程也执行一遍代码。谁执行的过程中调研getpid()就是得到的谁的进程pid。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。