这个实验是慕课网站上电子科技大学《Linux操作系统编程》中第五章 实验4 进程控制实验。写在这里便于以后的复习。
想详细了解的可以观看慕课的视频:Linux操作系统编程
先不说其他的知识。只讲一个fork函数。
fork函数有一个很奇妙的地方,一般普通的函数是调用一次,就得到一次的返回值。而fork函数的奇妙之处就是调用一次,它却能得到两次返回值。fork函数会从父进程中创建出一个子进程,然后在父进程和子进程中分别返回不同的值。
在父进程中,fork返回新创建的子进程的进程ID;而在子进程中,fork返回0。这一点等会结合实验结果理解会更直观。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
pid_t pid;
pid = fork();//调用fork函数开始则创建了一个新的子进程
//新的子进程从fork返回pid时从这里执行
//不同的进程返回值不一样
if(pid == -1)
{
printf("fork error!\n");
}
else if(pid == 0)
{//pip=0代表当前在子进程中
printf("the returned value is %d, ", pid);
printf("in child process!!");
printf("My PID is %d\n", getpid());
}
else
{//父进程pid变量会被赋值为子进程的PID。
//也就是说,当返回的值即不是0也不是-1的时候,那个这个值代表什么意思呢?
//没错,代表的正是子进程的PID。
//得到子进程的PID,说明当前运行的是父进程。
//打印顺序不固定,这要看系统的进程调度策略。
printf("the returned value is %d, ", pid);
printf("in father process!!");
printf("My PID is %d\n", getpid());
}
return 0;
}
在这个版本的Ubuntu和这个版本的Linux内核下运行的结果为:
panansi@panansi-Lenovo-N40-80:~$ cat /proc/version Linux version 5.3.0-51-generic (buildd@lgw01-amd64-018) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #44~18.04.2-Ubuntu SMP Thu Apr 23 14:27:18 UTC 2020 panansi@panansi-Lenovo-N40-80:~$ cd 桌面 panansi@panansi-Lenovo-N40-80:~/桌面$ gcc testprocess.c -o process panansi@panansi-Lenovo-N40-80:~/桌面$ ./process the returned value is 12187, in father process!!My PID is 12186 the returned value is 0, in child process!!My PID is 12187 从实验结果中可以看出,子进程的PID=12187,而在子进程中,返回值是0。在父进程中,返回的是子进程的PID,父进程的PID=12816。这正是前面所说的“在父进程中,fork返回新创建的子进程的进程ID;而在子进程中,fork返回0。“ 总结:上课的时候老师曾举过这个例子,当时每听懂。通过这个例子,已经理解fork返回值的含义。