main()
{
printf("The current process ID is %d
",getpid());
}
细心的读者可能注意到了,这个程序的定义里并没有包含头文件sys/types.h,这是因为我们在程序中没有用到pid_t类型,pid_t类型即为进程ID的类型。事实上,在i386架构上(就是我们一般PC计算机的架构),pid_t类型是和int类型完全兼容的,我们可以用处理整形数的方法去处理pid_t类型的数据,比如,用"%d"把它打印出来。
编译并运行程序getpid_test.c:
| $gcc getpid_test.c -o getpid_test $./getpid_test The current process ID is 1980 (你自己的运行结果很可能与这个数字不一样,这是很正常的。) |
再运行一遍:
| $./getpid_test The current process ID is 1981 |
正如我们所见,尽管是同一个应用程序,每一次运行的时候,所分配的进程标识符都不相同。
fork
在2.4.4版内核中,fork是第2号系统调用,其在Linux函数库中的原型是:
| #include<sys/types.h> /* 提供类型pid_t的定义 */ #include<unistd.h> /* 提供函数的定义 */ pid_t fork(void); |
只看fork的名字,可能难得有几个人可以猜到它是做什么用的。fork系统调用的作用是复制一个进程。当一个进程调用它,完成后就出现两个几乎一模一样的进程,我们也由此得到了一个新进程。据说fork的名字就是来源于这个与叉子的形状颇有几分相似的工作流程。
在Linux中,创造新进程的方法只有一个,就是我们正在介绍的fork。其他一些库函数,如system(),看起来似乎它们也能创建新的进程,如果能看一下它们的源码就会明白,它们实际上也在内部调用了fork。包括我们在命令行下运行应用程序,新的进程也是由shell调用fork制造出来的。fork有一些很有意思的特征,下面就让我们通过一个小程序来对它有更多的了解。
| /* fork_test.c */ #include<sys/types.h> #inlcude<unistd.h> ma |