我是靠谱客的博主 激昂冰淇淋,最近开发中收集的这篇文章主要介绍Linux系统编程-进程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Linux系统编程-进程

    • 进程的介绍
    • fork()函数-进程的创建
    • vfork()函数
    • 进程的退出
      • 孤儿进程
    • 进程的等待

进程的介绍

1.什么是程序,什么是进程?
程序是静态的概念,gcc xx.c -o pro 磁盘中生成pro文件,叫做程序
进程是程序的一次运动活动,通俗点意思是程序跑起来了,系统中就多了一个进程。
2.使用getpid()函数可以获取自身的进程标识符,getppid获取父进程的进程标识符。
3.文件标识符:每个进程都有一个非负整数表示的唯一ID,叫做pid,类似身份证。
pid = 0 :称为交换进程(swapper); 作用:进程调度
pid =1:init进程 作用:系统初始化

fork()函数-进程的创建

原型:pid_t fork(void);
fork函数调用成功,返回两次。
返回值为0,代表当前进程是子进程
返回值为非负数,代表当前进程是父进程,调用失败,返回-1;

fork()创建子进程的一般目的:
1.一个父进程希望赋值自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的,----父进程等待客户端的服务请求,当这种请求到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求到达。
2.一个进程要执行一个不同的程序。这对shell是常见的情况。在这种情况下,子进程从fork返回后立即调用exec。
在这里插入图片描述
3.写时拷贝
概念:我们把父进程给子进程拷贝存储空间的方式称为写时拷贝。
写时拷贝是一种可以推迟甚至免除拷贝数据的技术。在父进程创建子进程时,内核此时并不复制整个父进程地址空间给子进程,而是让父进程和子进程共享父进程的地址空间,内核将它们对这块地址空间的权限变为只读的。只有在需要写入修改的时候,内核为修改区域的内存制作一个副本,通常是虚拟存储器系统的一页。从而使父子进程拥有各自的地址空间。
也就是说,新的地址空间只有在需要写入修改的时候才开辟,在此之前,父子进程只是以只读方式共享。这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。
另:Linux原先的拷贝方式:数据段、堆、栈、打开的文件、IO流等等的拷贝

vfork()函数

也可以创建进程,与fork()的区别:
区别一:vfork直接使用父进程存储空间,不拷贝
区别二:vfork保证子进程先运行,当子进程调用exit退出后,父进程才执行

进程的退出

5种正常退出:

a.Main函数调用return

b.进程调用exit(),标准c库

c.进程调用_exit()或者_Exit(),属于系统调用

d.进程最后一个线程返回

e.最后一个线程调用pthread_exit

3种异常退出:

a.调用abort

b.当进程收到某些信号时,如ctrl+c

c.最后一个线程对取消(cancellation)请求做出响应

孤儿进程

父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时子进程叫做孤儿进程。Linux避免系统存在过多孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。

进程的等待

 **检查wait和waitpid所返回的终止状态的宏**

  宏                                    说明

WIFEXITED                        若为正常终止子进程返回的状态,则为真。对于这种情况可执行WEXITSTATUS(status),取子进程传送给exit、_exit、_Exit参数的低8位

注:父进程等待子进程退出,并收集子进程的退出状态。子进程退出状态不被收集,变成僵尸进程

注:调用wait函数时,函数阻塞,等待子进程退出,收集子进程的退出状态。

也就是:1.如果其所有子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。如果它没有任何子进程,则立即出错返回。

头文件:#include<sys/wait.h>
        #include<sys/type.h>
原型
pid_t wait(int *status)
返回值:
    成功:返回被等待进程(子进程)pid
    失败:返回-1
参数:输出型参数,获取子进程退出状态,不关心则可以设置为NULL

头文件: #include<sys/type.h>
        #include<sys/wait.h>
原型:pid_t waitpid(pid_t pid,int *status,int options)
返回值:
   (1)当正常返回的时候waitpid返回收集到的子进程的进程ID

   (2)如果设置了选项WNOHANG,而调用中waitpid发现已经没
      有已经可以退出的子进程可收集,则返回0

   (3)如果调用中出错,则返回-1,这时errno会被设置成相应的
      值以指示错误所在
      
 1.pid
  pid=-1,等待任一个子进程,与wait等效
  pid>0,等待其进程ID与pid相等的子进程
2.
   WIFEXITED(status):    若为正常终止子进程返回的状态,则为
                         真(此参数是查看进程是否是正常退出)

   WEXITSTATUS(status):  若WEXITSTATUS非零,提取子进程退
                         出码(查看进程的退出码)
3.options
     WNOHANG:若由pid指定的子进程并不是立即可用的,则waitpid不祖塞

exec族函数
参考博文:https://blog.csdn.net/u014530704/article/details/73848573```
返回值:
  exec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。 

带l的一类exac函数(l表示list),包括execl、execlp、execle,要求将新程序的每个命令行参数都说明为 一个单独的参数。这种参数表以空指针结尾。

system函数
参考博文:https://www.cnblogs.com/leijiangtao/p/4051387.html

> #include <stdlib.h>
int system(const char *command);

system函数的返回值如下:
成功,则返回进程的状态值;
当sh不能执行时,返回127,失败返回-1;


popen函数
参考博文:https://blog.csdn.net/libinbin_1014/article/details/51490568
比system在应用的好处:可以获取运行的输出结果
原型:
#include “stdio.h”
FILE *popen( const char*command, const char* *mode )
参数说明:

  command:是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令。

  mode: 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。

最后

以上就是激昂冰淇淋为你收集整理的Linux系统编程-进程的全部内容,希望文章能够帮你解决Linux系统编程-进程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部