进程控制遇到的问题

这周先学了进程环境和进程操作,对于什么是进程有大致的一个了解,但是没有真正的明白到底什么是进程。在进程控制这一章一开始学习的时候,在尽力的去理解什么是进程,我理解的进程就是功能性的函数一样,每实现一个功能叫做一个进程,也可以说是叫做过程,是比较具体的过程。

第一个问题:

第11章进程管理的第一个示例程序就是打印当前进程的进程ID,代码如下:

 1 #include <stdio.h>
 2
 3 #include <unistd.h>
 4
 5 int main()
 6
 7 {
 8
 9     pid_t pid, ppid, uid, euid, gid, egid;
10
11     pid = getpid();      /* 得到进程ID */
12
13     ppid = getppid(); /* 得到父进程ID */
14
15     uid = getuid();      /* 得到用户ID */
16
17     euid = geteuid(); /* 得到有效用户ID */
18
19     gid = getgid();      /* 得到组ID */
20
21     egid = getegid(); /* 得到有效组ID */
22
23     printf("id of current process : %u\n", pid); /* pid_t实际上是无符号整型,
24
25                                                     所以使用%u而不是%d */
26
27     printf("parent id of current process : %u\n", ppid);
28
29     printf("user id of current process : %u\n", uid);
30
31     printf("effective user id of current process : %u\n", euid);
32
33     printf("group id of current process : %u\n", gid);
34
35     printf("effective group id of current process : %u\n", egid);
36
37     return 0;
38
39 }

运行结果:

运行结果可以看出来,每次运行这个程序的时候发现,子进程的ID每次加1,而其他的进程ID都没有变化。上图中也可以发现子进程的ID是每次加1,后来我在调试的时候,又重新编译再运行的结果如下图:

这个图中看出来重新编译之后与之前相比,进程ID不止是加1,再对比之前的规律来说,就是这次进程ID加了8可能是跟中间运行gcc pid.c –o app这条指令有关。接下来有进行测试。结果显示,一个ls指令也是占了一个进程,因此会打印进程ID加2。

后来再做了测试,发现,运行一次程序之后,过一会再运行的话进程ID也会有很大的变化,我觉得这个ID变化比较大的原因是在这个时间间隔内系统内有其他的进程运行的结果。

回头看gcc pid.c –o app这条指令之后再运行程序,进程ID的变化是6,后来我有测试了几次,发现每次间隔都是6。

这三次测试中发现,每一次重新编译之后在运行程序,进程ID的间隔都是6,这说明gcc –o pid.c app这条指令用了6个进程。再回到之前学习的gcc编译流程来看,gcc编译的过程4步,先将.c文件预处理.i文件,再将.i文件编译成汇编语言生成.s文件,再将.s文件经过汇编生成目标文件.o文件,最后将.o文件链接起来生成.exe文件,最后运行。从.c文件到.exe文件经过了4个过程,但是这个过程占用了6个进程,这4个过程中是不是有的过程占用了1到2个进程?

第二个问题:

打印父进程和子进程的进程ID程序如下:

 1 #include <stdio.h>
 2
 3 #include <stdlib.h>
 4
 5 #include <unistd.h>
 6
 7 int main(void)
 8
 9 {
10
11     pid_t pid;           /* 保存进程ID */
12
13     pid = fork();    /* 创建一个新进程 */
14
15     if(pid < 0){     /* fork出错 */
16
17         printf("fail to fork\n");
18
19         exit(1);
20
21     }else if(pid == 0){   /* 子进程 */
22
23         printf("this is child, pid is : %u\n", getpid());
24
25                         /* 打印子进程的进程ID */
26
27     }else{
28
29         printf("this is parent, pid is : %u, child-pid is : %u\n", getpid(),
30
31         pid);           /* 打印父进程和其子进程的进程ID */
32
33     }
34
35     return 0;
36
37 }

这个代码的运行结果是:

根据运行结果发现,先打印的是父进程的进程ID,再打印子进程的进程ID。为什么pid会等于0。书上说的是“对于子进程,fork()函数返回0。由于系统的0号进程是内核进程,所以子进程的进程号不可能是0,由此区别父进程和子进程”,这句话跟这个程序结合起来有点不太理解,pid等于0才能执行“printf("this is child, pid is : %u\n", getpid());”这句话,但是程序中pid执行了这句话,是不是说明这里的pid等于0,那这个pid的值为什么等于0?

时间: 2024-10-05 09:37:05

进程控制遇到的问题的相关文章

Linux - 进程控制 代码(C)

进程控制 代码(C) 本文地址:http://blog.csdn.net/caroline_wendy 输出进程ID,getpid(). 代码: /*By C.L.Wang * Eclipse CDT * Ubuntu 12.04 * 2014.10.5*/ #include "apue.h" #include "error.h" int main(void) { printf("hello world from process ID %ld\n"

六、Linux进程控制

1. Linux进程概述 进程是一个程序一次执行的过程,它和程序有本质区别. 程序是静态的,它是一些保存在磁盘上的指令的有序集合:而进程是一个动态的概念,它是一个运行着的程序,包含了进程的动态创建.调度和消亡的过程,是Linux的基本调度单位. 那么从系统的角度看如何描述并表示它的变化呢?在这里,是通过进程控制块(PCB)来描述的.进程控制块包含了进程的描述信息.控制信息以及资源信息,它是进程的一个静态描述. 内核使用进程来控制对CPU和其他系统资源的访问,并且使用进程来决定在CPU上运行哪个程

Linux进程控制编程

一.获取ID #include<sys/types.h> #include<unistd.h> pid_t getpid(void)    获取本进程ID pid_t getppid(void)  获取父进程ID 父进程:现有进程中,创建新的进程. 例:getpid.c #include<stdio.h> #include<unistd.h> #include<stdlib.h> int main() { printf("PID=%d\

APUE(8)---进程控制(1)

一.进程标识 每个进程都有一个非负整型标识的唯一进程ID.因为进程ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.进程ID虽然是唯一的, 但是却是可以复用的.ID为0的进程通常是调度进程,常常被称为交换进程(swapper).该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程.进程ID为1通常是init进程,在自举过程结束时由内核调用.此进程负责在自举内核后启动一个UNIX系统,init通常读取与系统有关的初始化文件,并将系统引导一个状态.init进程绝不会

Linux进程控制(二)

1. 进程的创建 Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen() 1.1. system函数 原型: #include <stdlib.h> int system(const char *string); system函数通过调用shell程序/bin/sh –c来执行string所指定的命令,该函数在内部是通过调用execve("/bin/sh",..)函数来实现的.通过system创建子进程后,原进程和子进程各自运行,

linux 命令及进程控制

main.c  main.o/main.obj  main/main.exe          编译                连接 程序运行;      两步: gcc/g++  -c  main.c/main.cpp  -> main.o              gcc/g++ -o main  main.o -> main(可执行文件)     一步:  gcc -o main mian.c  -> main    工程文件:       rm  *.o     gcc  -

Linux进程控制——exec函数族

原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char

APUE学习笔记(第八章 进程控制)

本章介绍UNIX系统的进程控制,包括创建新进程.执行程序和进程终止. 进程标识 每一个进程都有一个非负整数表示的唯一进程ID,除了进程ID,每个进程还有一些其他标识符.下列函数返回这些标识符 #include <unistd.h> pid_t getpid(void); pid_t getppid(void); uid_t getuid(void); uid_t geteuid(void); gid_t getgid(void); gid_t getegid(void); 函数fork 一个现

第八章:进程控制

8.1:引言 本章介绍Unix的进程控制,包括创建新进程.执行程序和进程终止.还将说明进程属性的各种ID--实际.有效和保存的用户和组ID,以及它们如何受到进程控制原语的影响.还包括解释器文件和system函数,最后讲述大多数Unix系统所提供的进程会计机制. 8.2:进程标识符 每个进程都有一个非负整型表示的唯一进程ID.虽然是唯一的,但是进程ID却可以重用,当一个进程终止后,其进程ID就可以再次使用了.Unix使用延迟重用算法,避免新进程的ID等于最近终止的进程的ID. 除了进程ID,每个进

【转载】linux进程控制-exec系列 exec系统调用

inux进程控制-exec系列 说是exec系统调用,实际上在Linux中,并不存在一个exec()的函数形式,exec指的是一组函数,一共有6个,分别是: #include <unistd.h>int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ...,