创建进程有两种方式,1:由操作系统创建;2:由父进程创建
由操作系统创建的进程,它们之间是平等的,一般不存在资源继承关系(称之为:系统进程)。而对于由父进程创建的进程(子进程),它们和父进程之间是隶属的关系,然后子进程继续创建属于自己的子进程,形成进程家族,子进程可以继承其父进程几乎所有资源
系统调用fork是创建一个新进程的唯一方法
pid_t(类型探究)(参考博客:http://blog.chinaunix.net/uid-20753645-id-1877915.html)
1,/usr/include/sys/types.h中有如下定义
#ifndef __pid_t_defined
typedef __pid_t pid_t;
# define __pid_t_defined
#endif
(
pid_t 其实就是__pid_t类型)
2,/usr/include/bits/types.h中可以看到这样的定义
/* We want __extension__ before typedef's that use nonstandard base types
such as `long long' in C89 mode. */
# define __STD_TYPE __extension__ typedef
#elif __WORDSIZE == 64
# define __SQUAD_TYPE long int
# define __UQUAD_TYPE unsigned long int
....................
__STD_TYPE __PID_T_TYPE __pid_t; /* Type of process identifications. */
__STD_TYPE __FSID_T_TYPE __fsid_t; /* Type of file system IDs. */
__STD_TYPE __CLOCK_T_TYPE __clock_t; /* Type of CPU usage counts. */
__STD_TYPE __RLIM_T_TYPE __rlim_t; /* Type for resource measurement. */
这里我们要注意的是:__extension__ typedef(关于__extension__的作用:gcc对标准C语言进行了扩展,但用到这些扩展功能时,编译器会提出警告,使用__extension__关键字会告诉gcc不要提出警告,所以说:相当于typedef)
(__PID_T_TYPE也就是__pid_t)
3,/usr/include/bits/typesizes.h中可以看到这样的定义
#define __OFF64_T_TYPE __SQUAD_TYPE
#define __PID_T_TYPE __S32_TYPE
#define __RLIM_T_TYPE __SYSCALL_ULONG_TYPE
(_S32_TYPE也就是__PID_T_TYPE)
4,/usr/include/bits/types.h中我们终于找到了这样的定义
#define __U16_TYPE unsigned short int
#define __S32_TYPE int
#define __U32_TYPE unsigned int
到了这里,我们终于找到了定义,原来:pid_t就是int类型的了
pid: 调用fork函数的返回值,(0:子进程的运行)(-1:进程创建失败)(其他:一般为子进程的标识符)
getpid:(当前进程的标识符)
getpid() returns the process ID of the calling process. (This is often used by routines that generate unique temporary filenames.)
getppid:(当前进程的父进程的标识符)
getppid() returns the process ID of the parent of the calling process.
程序1:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t pid;
printf(" %d %d %d\n", pid,getpid(), getppid());
printf("Process Creation Study!\n");
pid = fork();
switch(pid)
{
case 0:
printf("Child process is running , retuernpid is %d,curentpid is %d, Parent is %d\n",pid, getpid(), getppid());
break;
case -1:
printf("Process creation failed\n");
break;
default:
printf("Parent process is running , returnpid is %d,curentpid is %d, parentpid is %d\n",pid ,getpid(), getppid());
}
exit(0);
}
运行结果:
从运行结果可以看到:
PID:0 getpid():5581 getppid():5557
说明:当前这个程序(main函数)调入内存变成进程,应该是由其它的进程(进程号为5557的那个进程,应该是调用fork函数,产生的子进程(进程号为5581),fork返回为0)
这里查看一下进程:ps -A
。。。。。
可以知道那个进程号为5557的进程就是bash(一般来说,安装linux时,如果没有改shell,默认的都是bash,所以我们开启一个终端就会生成一个叫做bash的进程,再打开一个终端又会生成一个bash进程,关掉一个终端就会少一个bash进程,