linux多进程编程

简介: 一、进程的概念        首先了解,什么是进程? Linux 操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢? 在现代的操作系统里面,都有程序和进程的概念。

一、进程的概念
       首先了解,什么是进程?

Linux 操作系统是面向多用户的.在同一时间可以有许多用户向操作系统发出各种命令.那么操作系统是怎么实现多用户的环境呢? 在现代的操作系统里面都有程序和进程的概念那么什么是程序,什么是进程呢? 通俗的讲程序是一个包含可以执行代码的文件,是一个静态的文件而进程是一个开始执行但是还没有结束的程序的实例.就是可执行文件的具体实现.一个程序可能有许多进程,而每一个进程又可以有许多子进程.依次循环下去而产生子孙进程当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作使程序变成进程以供系统调用在系统里面只有进程没有程序为了区分各个不同的进程,系统给每一个进程分配了一个ID(就象我们的身份证)以便识别为了充分的利用资源,系统还对进程区分了不同的状态将进程分为新建运行阻塞就绪和完成五个状态新建表示进程正在被创建运行是进程正在运行阻塞是进程正在等待某一个事件发生就绪是表示系统正在等待CPU 来执行命令而完成表示进程已经结束了系统正在回收资源

二、进程的标志
       明白了什么是进程,接下来要了解进程的标志。

   上面我们知道了进程都有一个ID,那么我们怎么得到进程的ID ?系统调用getpid 以得到进程的ID,getppid 可以得到父进程(创建调用该函数进程的进程)ID.

#include ;

pid_t getpid(void);

pid_t getppid(void);

进程是为程序服务的而程序是为了用户服务的系统为了找到进程的用户名还为进程和用户建立联系这个用户称为进程的所有者相应的每一个用户也有一个用户ID通过系统调用getuid 可以得到进程的所有者的ID由于进程要用到一些资源Linux 对系统资源是进行保护的为了获取一定资源进程还有一个有效用户ID这个ID 和系统的资源使用有关涉及到进程的权限.通过系统调用geteuid 我们可以得到进程的有效用户ID.和用户ID相对应进程还有一个组ID 和有效组ID 系统调用getgid getegid 可以分别得到组ID 和有效组ID

三、进程的创建
      学习如何创建进程!    

   创建一个进程的系统调用很简单.我们只要调用fork 函数就可以了.

    #include ;

    pid_t fork();

    当一个进程调用了fork 以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID 和父进程ID,其他的都是一样.就象符进程克隆(clone)自己一样当然创建两个一模一样的进程是没有意义的为了区分父进程和子进程,我们必须跟踪fork 的返回值.fork 掉用失败的时候(内存不足或者是用户的最大进程数已到)fork 返回-1否则fork 的返回值有重要的作用.对于父进程fork 返回子进程的ID而对于fork 子进程返回0我们就是根据这个返回值来区分父子进程的父进程为什么要创建子进程呢?前面我们已经说过了Linux 是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源.有时进程为了早一点完成任务就创建子进程来争夺资源一旦子进程被创建,父子进程一起从fork 处继续执行,相互竞争系统的资源.有时候我们希望子进程继续执行而父进程阻塞直到子进程完成任务这个时候我们可以调用wait waitpid 系统调用

    Fork 函数被调用一次,但返回两次。两次返回的唯一区别是子进程的返回值是 0 ,而父进程的返回值则是新子进程的进程 ID 。子进程获得父进程数据空间、堆和栈的副本。注意,这是子进程所拥有的副本。父子进程并不共享这些存储空间部分。

四、通过实例加深对多进程的理解
[root@test bdkyr]# cat fork_test.c

/*

*  create by bdkyr

*date 2015-1-21

*/
#include
#include
#include
#include
#include
#include

#define MAXLINE 4096   /* max line length */

int glob = 6;
char buf[]= "a write to stdout\n";

void err_sys(const char *fmt, ...);
static void err_doit(int, int, const char *, va_list);

int main(void){
int var;
pid_t pid;
var = 88;
if (write (STDOUT_FILENO, buf, sizeof(buf) -1) != sizeof(buf)-1)
err_sys("write error");
printf("before fork\n");
if((pid = fork()) err_sys("fork error");
}else if(pid == 0){
glob++;
var++;
}else{
sleep(2);
}
printf("pid=%d, glob = %d, var = %d\n", getpid(),glob, var);
exit(0);
}

void err_sys(const char *fmt, ...){
va_list ap;
va_start(ap, fmt);
err_doit(1, errno, fmt, ap);
va_end(ap);
exit(1);
}

static void err_doit(int errnoflag, int error, const char *fmt, va_list ap){
vsnprintf(buf, MAXLINE, fmt, ap);
if(errnoflag)
snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s", strerror(error));
strcat(buf, "\n");
fflush(stdout);
fputs(buf, stderr);
fflush(NULL);
}

[root@test bdkyr]# gcc fork_test.c -o fork_test
[root@test bdkyr]# ./fork_test                 
a write to stdout
before fork
pid=5209, glob = 7, var = 89
pid=5208, glob = 6, var = 88

五、总结
       说到底,多进程我们可以简单理解为,一个进程表示的,就是一个可执行程序的一次执行过程中的一个状态。操作系统对进程的管理,典型的情况,是通过进程表完成的。进程表中的每一个 表项,记录的是当前操作系统中一个进程的情况。对于单 CPU的情况而言,每一特定时刻只有一个进程占用 CPU,但是系统中可能同时存在多个活动的(等待执行或继续执行的)进程。fork()用于从已存进程中建立一个新进程,新进程为子进程,老进程为父进程.可以通过检查"fork()"地返回值知道哪个是子进程哪个是父进程。父进程得到的返回值是子进程的进程号,而子进程则返回0。
       您有收获吗?

目录
相关文章
|
27天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
64 1
|
16天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
79 13
|
23天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
1月前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
2月前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
151 4
linux进程管理万字详解!!!
|
2月前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
2月前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
90 8
|
2月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
144 1
|
2月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
2月前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
75 4