-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.
第一:
实验-fork 创建新进程
linux中,可以使用fork函数创建和当前进程一模一样的进程,叫子进程,原来的进程叫父进程
使用 man 学习 fork 进程
1)如下图所示,使用命令“man 2 fork”
2)如下图所示,函数 fork
3)接着注意一下相关的函数,如下图所示
4)接着介绍一下 fork 的用法
pid_t fork(void);
– 参数:无
– 返回值:执行成功,子进程pid 返回给父进程,0 返回给子进程;出现错误-1,返回给父进程。执行失败的唯一情况是内存不够或者id 号用尽,不过这种情况几乎很少发生。
第二:
fork函数(看了例子之后再回头理解一次下面几句话)
– 系统函数fork 调用成功,会创建一个新的进程,它几乎会调用差不多完
全一样的fork 进程
– 子进程的pid 和父进程不一样,是新分配的
– 子进程的ppid 会设置为父进程的pid,也就是说子进程和父进程各自的
“父进程”不一样
– 子进程中的资源统计信息会清零
– 挂起的信号会被清除,也不会被继承
– 所有文件锁也不会被子进程继承
函数例程
编写简单的 fork.c 文件测试 fork 函数
#include <stdio.h>
#include <unistd.h>
main()
{
pid_t pid;
int i=100;
pid = fork();
//调用出错
if(pid == -1){
printf("fork failed\n");
return 1;
}
//返回给父进程子进程号,返回值大于0
else if(pid){
i++;
printf("\nThe father i = %d\n",i);
printf("The father return value is %d\n",pid);
printf("The father pid is %d\n",getpid());
printf("The father ppid is %d\n",getppid());
while(1);
}
//返回子进程0,返回值等于0返回给子进程
else{
i++;
printf("\nThe child i = %d\n",i);
printf("The child return value is %d\n",pid);
printf("The child pid is %d\n",getpid());
printf("The child ppid is %d\n",getppid());
while(1);
}
return 0;
}
第三:
1)在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录
“/home/linuxsystemcode/exe”,将源码 fork.c 拷贝进去,如下图所示。
2)使用命令“arm-none-linux-gnueabi-gcc -o fork fork.c -static”编译 fork 文件,如下图所示,使用命令“ls”可以看到生成了 fork 可执行文件。
3)将编译成的可执行文件 fork,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘,运行程序如下。
如上图所示,可以看到打印的父进程和子进程号,然后其中打印的 i 都是一样的。子进程可以使用父进程中定义的变量,和父进程中的变量却是不同的变量。
第四:
进程终止 exit
1)如下图所示,使用命令“man 2 exit”
2)如下图所示,有一些相关的函数 execve(2), exit_group(2), fork(2), kill(2), wait(2)等等
3)接着介绍一下 void exit(int status)的用法
void exit(int status)
参数:返回给父进程的参数。
返回值:无
函数_exit 和 exit 没什么区别,不需要花太多时间去追究。
创建进程还有一个 vfork 函数,感兴趣的可以通过网络找个例子实现以下,vfork 的使用会产生很多新问题,使用 vfork 创建的进程结束需要调用_exit。