Linux-进程-笔记

学习内容:

1.进程相关概念

2.创建进程函数fork的使用

3.vfork函数创建进程,与fork函数区别

4.进程退出(父进程等待子进程退出)

5.exec族函数

6.system函数

7.popen函数




一、

1.什么是程序,什么是进程,有什么区别?

①程序是静态概念,gcc xxx.c -o pro

磁盘中生成的pro文件,叫做程序

②进程是程序一次运行活动,通俗意思是程序跑起来了,系统就多了一个进程

2.如何查看系统中有哪些进程?

①使用ps指令查看

实际工作中,配合grep来查找程序中是否存在某一进程

ps -aux 查看所有进程

ps -aux|grep init  其中grep 是过滤  后面是仅查看init进程

②使用top指令查看,类似windows任务管理器

3.什么是进程标识符?

每个进程都有一个非负整数表示的唯一ID,叫做pid,类似身份证

Pid = 0:称为交换进程(swapper) 

作用  ---  进程调度

Pid  = 1 :init 进程

作用 --- 系统初始化

#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>

//pid_t getpid(void);
//pid_t getppid(void);
int main(){
    pid_t pid;
    pid = getpid();
    printf("my pid is %d",pid);    
    return 0;
}

编程调用getpid函数 获取自身的进程标识符,

getppid获取父进程的进程标识符

4.什么叫父进程,什么叫子进程

进程A创建了进程B

那么A叫做父进程,B叫做子进程,父子进程是相对的概念,理解为人类中的父子关系

5.C程序的存储空间是如何分配的?


二、创建进程函数fork的使用及应用场景

使用fork创建一个进程

pid_t fork(void);

fork函数调用成功,返回两次

返回值为0,  代表当前进程是子进程

返回值为非负数,  代表当前进程是父进程

调用失败, 返回-1

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

int main(){
    pid_t pid;
    pid = fork();
    
    if(pid>0){

        printf("this is father print,father pid = %d\n",getpid());
  } else if(pid == 0){
        pirntf("thid is child print,child pid = %d\n",get[id());
        
    }
        
    return 0;
}

fork()后代码段共享,父子进程均跑

#include <unistd.h>
#include<stdio.h>
int main(){
    pid_t pid;
    int date = 10;
    printf("father: id = %d\n",getpid());
    
    pid = fork();
    
    if(pid>0){
        printf("this is father pid :%d\n",getpid());

    }else if(pid == 0){
        printf("this is child pid :%d\n",getpid());
        date = date + 100;

    }
         printf("date = %d\n",date);   

        return 0;
}

输出结果:father:id = 6264

                  this is father pid = 6264

                  date = 10

                  this is child pid = 6265

                  date = 110 

全拷贝与写实拷贝(旧的和新的)

全拷贝,数据端 堆 栈 文件io流等

copy on write子进程对数据不改变,就共享变量,只有子进程改变数据,才对子进程的地址空间拷贝一份数据修改

fork应用场景

fork创建一个子进程的一般目的

(1)一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中最常见的----父进程等待客户的服务请求。当这种情况到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求 的到达。

(2)一个进程要执行一个不同的程序,这对shell是常见的情况。在这种情况下,子进程从fork返回后立即调用exec。

三、vfork函数也可以创建进程,与fork区别

关键区别一:

vfork直接使用父进程存储空间,不拷贝。

关键区别二:

vfork保证子进程先运行当子进程调用exit(break)退出后,父进程才执行。

四、进程退出

正常退出

1.Main函数调用return

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

3.进程调用_exit()或者_Exit();属于系统调用

补充:

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

2.最后一个县城调用pthread_exit

异常退出

1.调用abort

2.当进程收到某些信号时,如Ctrl+C

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

②父进程等待子进程退出

(a.一个父进程希望复制自己,使父子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待客户端的服务请求。当这种请求到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求的到达。

    b.一个进程要执行一个不同的,这对shell是常见的情况。在这种情况下,子进程从fork返回后立刻调用exec)

父进程等待子进程退出并收集子进程的退出状态 wait(&status);父进程挂起状态等待子进程返回①wait();收集子进程状态,

waitpid(pid,&status,WNOHANG);子进程pid号,status(退出值),不挂起方式

父子进程一起走,不挂起,子进程结束状态被收集,变僵死进程

Waitpid

--子进程退出状态不被收集(用wait()收集),变成僵死进程(僵尸进程(Z+))

---孤儿进程:

     ①父进程如果不等待子进程退出,在子进程之前就结束了自己的”生命“,此时子进程叫做孤儿进程

      ②linux避免系统存在过多的孤儿进程,系统的 init 进程收留孤儿进程,变成孤儿进程的父进程。getppid()

五、exec族函数

原文 linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)_牛仔的blog-CSDN博客_execle

exec族函数函数的作用:

我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该进程被完全替换为新程序。因为调用exec函数并不创建新进程,所以前后进程的ID并没有改变。

exec函数配合fork的使用:

实现功能,当父进程检测到输入为1的时候,建子进程把配置文件字段值修改掉。(简洁代码)

六、system函数

system相当于分装后的exec函数(简单粗暴,直接用)    sh -c ./***
相关函数
      fork,execve,waitpid,popen
表头文件
      #include<stdlib.h>
定义函数
      int system(const char * string);
函数说明
      system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
返回值
      如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果 system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。
附加说明
      在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。

七、popen函数

popen比system好处是  可以获取运行的结果

popen 可以将结果存放数组或文件里

linux下popen的使用心得_libinbin_1014的专栏-CSDN博客_linux popen

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值