本帖最后由 yuanlai2010 于 2014-8-6 22:23 编辑
进程及创建进程
参与Helper2416开发板助学计划心得
进程的UNIX标准定义:
“一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源”
正在运行的程序或进程有程序代码/数据/变量(占用着系统内存)/打开的文件(文件描述符)和环境组成.
进程表
Linux进程表就像是一个数据结构,它把当前加载在内存中的所有进程的有关信息保存在一个表中,其中包括进程的PID、进程的状态、命令字符串和其他一些ps命令输出的各类信息。(可以通过ps命令来查看)
进程标识符(PID)
在Linux系统中,每个进程都会有一个唯一的数字编号,称之为PID(进程标识符)
系统对进程的管理就是通过PID来索引的。
在程序中可以通过以下两个函数来获取当前进程的PID,以及当前进程的父进程的PID(即当前进程的PPID)
关于父子进程:假设在A进程中创建了进程B,则A称为B的父进程,B称为A的子进程。
通过以下函数可以获取当前进程的PID,或者PPID:
- #include <sys/types.h> //这里提供对pid_t的定义
- #include <unistd.h>
- pid_t getpid(void); //返回当前进程的PID
- pid_t getppid(void); //返回当前进程的PPID
复制代码
在程序中创建新的进程
在Linux中有两个函数可以创建进程,那就是fork()与vfork()
比较有意思的是,fork函数只调用一次,但是在子进程和父进程都返回值,而且返回的值不相同,fork有以下三种不同的返回值:
1)在父进程中,fork返回新创建子进程的进程ID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值;
如下例子,用fork来创建一个子进程。
- /* 2014 - 08 -06
- * yuanlai2010
- * fork调用测试
- */
-
- #include <unistd.h>
- #include <sys/types.h>
- #include <stdio.h>
- #include <stdlib.h>
-
- int main()
- {
- pid_t pid;
- int count = 0;
-
- printf("fork program starting!\n");
-
- pid = fork();
-
- switch(pid){
- case -1:
- printf("fork failed\n");
- exit(1);
- case 0:
- printf("this is child, the PID is %d\n", getpid());
- printf("and the count = %d\n",++count);
- break;
- default:
- printf("this is parent, the PID is %d\n",getpid());
- printf("and the count = %d\n",++count);
- break;
- }
- exit(0);
- }
复制代码运行结果如下
- [root@jyxtec fork]# ./fork_arm
- fork program starting!
- this is parent, the PID is 175
- and the count = 1
- [root@jyxtec fork]# this is child, the PID is 176
- and the count = 1
复制代码进程调用fork()函数时,这个系统调用复制当前的进程,在进程表中创建一个新的表项,新表项中的许多属性与当前进程是相同的,新进程几乎与原进程一模一样,执行的代码也会完全相同(共享代码段),但是新进程有自己的数据空间、环境和文件描述符。fork()在成功调用完毕时会在子进程中返0,在父进程中返回的是子进程的PID,所以会出现以上的运行结果,对于子进程与父进程的运行顺序是不确定的。如果我们在新的进程中再调用exec系统调用,就可以创建出一个实实在在的新进程来完成特定的工作了
vfork()同fork函数很相似,细微的不同点主要在以下几点:
1:vfork函数在创建新的进程的时候,所有的数据都是共享父进程的。而fork创建的新进程则仅共享代码段。
2:在之前的fork函数调用后,对父子进程的执行顺序是没有限制的,但是在vfork调用后是限定了先执行子进程的,而且要一直到子进程执行exec或者exit后父进程才有机会被运行。
通过以下实验与刚开始那个fork实验的比较就就能看出其中的不同之处:
- /* 2014 - 08 -06
- * yuanlai2010
- * vfork调用测试
- */
-
- #include <unistd.h>
- #include <sys/types.h>
- #include <stdio.h>
- #include <stdlib.h>
-
- int main()
- {
- pid_t pid;
- int count = 0;
-
- printf("fork program starting!\n");
-
- pid = vfork();
-
- switch(pid){
- case -1:
- printf("fork failed\n");
- exit(1);
- case 0:
- printf("this is child, the PID is %d\n", getpid());
- printf("and the count = %d\n",++count);
- break;
- default:
- printf("this is parent, the PID is %d\n",getpid());
- printf("and the count = %d\n",++count);
- break;
- }
- exit(0);
- }
复制代码运行结果如下
- [root@jyxtec fork]# ./fork_arm
- fork program starting!
- this is child, the PID is 179
- and the count = 1
- this is parent, the PID is 178
- and the count = 2
- [root@jyxtec fork]#
复制代码
细心的你可能会发现在第一个实验中的输出结果有点乱,是什么原因,将在下一篇帖子讲述。
论坛ID:yuanlai2010
发表时间:2014-08-06