Linux进程,fork-专研精讲(实例讲解)!!!


创建进程有两种方式,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进程,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值