首页 资讯 应用 高压 设计 行业 低压 电路图 关于

嵌入式

旗下栏目: PLC 嵌入式 单片机 DCS

Linux进程,fork-专研精讲

嵌入式 | 发布时间:2018-06-02 | 人气: | #评论# | 本文关键字:Linux,进程,fork
摘要:创建进程有两种方式,1:由操作系统创建;2:由父进程创建--- 由操作系统创建的进程,它们之间是平等的,一般不存在资源继承关系(称之为:系统进程)。而对于由父进程创建的进程(子进

创建进程有两种方式,1:由操作系统创建;2:由父进程创建---由操作系统创建的进程,它们之间是平等的,一般不存在资源继承关系(称之为:系统进程)。而对于由父进程创建的进程(子进程),它们和父进程之间是隶属的关系,然后子进程继续创建属于自己的子进程,形成进程家族,子进程可以继承其父进程几乎所有资源.系统调用fork是创建一个新进程的唯一方法

pid_t(类型探究)

  1. #ifndef __pid_t_defined  

  2. typedef __pid_t pid_t;  

  3. # define __pid_t_defined  

  4. #endif  

pid_t 其实就是__pid_t类型) 

2,/usr/include/bits/types.h中可以看到这样的定义

/* We want __extension__ before typedef's that use nonstandard base types 

  1.    such as `long long' in C89 mode.  */  

  2. # define __STD_TYPE             __extension__ typedef  

  3. #elif __WORDSIZE == 64  

  4. # define __SQUAD_TYPE           long int  

  5. # define __UQUAD_TYPE           unsigned long int  

  6. ....................  

  7.  __STD_TYPE __PID_T_TYPE __pid_t;        /* Type of process identifications.  */  

  8. __STD_TYPE __FSID_T_TYPE __fsid_t;      /* Type of file system IDs.  */  

  9. __STD_TYPE __CLOCK_T_TYPE __clock_t;    /* Type of CPU usage counts.  */  

  10. __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  

  1. #define __PID_T_TYPE            __S32_TYPE  

  2. #define __RLIM_T_TYPE           __SYSCALL_ULONG_TYPE  

(_S32_TYPE也就是__PID_T_TYPE)

4,/usr/include/bits/types.h中我们终于找到了这样的定义

  1. #define __U16_TYPE              unsigned short int  

  2. #define __S32_TYPE              int  

  3. #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:

  1. #include <stdio.h>                                                                                                   #include <sys/types.h>  

  2. #include <unistd.h>  

  3. #include <stdlib.h>  

  4. int main()  

  5. {  

  6.         pid_t pid;  

  7.         printf(" %d   %d   %d\n", pid,getpid(), getppid());  

  8.         printf("Process Creation Study!\n");  

  9.         pid = fork();  

  10.         switch(pid)  

  11.         {  

  12.                 case 0:  

  13.                         printf("Child process is running , retuernpid is %d,curentpid is %d, Parent is %d\n",pid, getpid(), getppid());  

  14.                         break;  

  15.                 case -1:  

  16.                         printf("Process creation failed\n");  

  17.                         break;   

  18.                 default:  

  19.                         printf("Parent process is running , returnpid is %d,curentpid is %d, parentpid is %d\n",pid ,getpid(), getppid());  

  20.         }  

  21.         exit(0);  

  22. }  

运行结果:

1527951872333109.png

从运行结果可以看到:

PID:0      getpid():5581    getppid():5557

说明:当前这个程序(main函数)调入内存变成进程,应该是由其它的进程(进程号为5557的那个进程,应该是调用fork函数,产生的子进程(进程号为5581),fork返回为0)

这里查看一下进程:ps -A

2.png

。。。。。

1.png

可以知道那个进程号为5557的进程就是bash(一般来说,安装linux时,如果没有改shell,默认的都是bash,所以我们开启一个终端就会生成一个叫做bash的进程,再打开一个终端又会生成一个bash进程,关掉一个终端就会少一个bash进程,但是终端并不是bash,终端是一个界面,但它调用bash)

这里我们来看一下进程树:pstree

2.png

我现在开了四个终端,接着看:

下面程序执行了:

父进程:returnpid:5582    current:5581    getppid:5557

(主函数中的fork返回5582,当前的进程号为5581,父进程为5557,也就是上面提到的bash进程)

子进程:returnpid:0          current:5582    getppid:5581

(fork函数返回0,当前是子进程在执行,进程号为5582,父进程为5581)

责任编辑:fork
首页 | 电气资讯 | 应用技术 | 高压电器 | 电气设计 | 行业应用 | 低压电器 | 电路图 | 关于我们 | 版权声明

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版 原创声明:本站大部分内容为原创,转载请注明电气自动化网转载;部分内容来源网络,如侵犯您的权益请发送邮件到[email protected]联系我们删除。