进程通信--消息队列

进程通信--消息队列
摘要由CSDN通过智能技术生成

进程

  • 程序和进程的def

    • 程序是静态的概念。
    • 进程是程序的一次运行活动,俗称,程序跑起来了
  • 如何查看系统中有哪些进程

    • 使用PS指令查看
      • ps-aux查看所有进程
    • 一般用grep配合PS指令,来查看自己需要的进程
  • 什么是进程标识符

    • 每个进程都有一个非负整数表示的唯一ID,叫做pid。
      • pid=0:交换进程
        • 作用:进程调度
      • pid=1:init进程
        • 作用:系统初始化
  • getpid():可以获取进程号

  • getppid():可以获取父进程号

  • c程序的存储空间的分配

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VXGJWbX2-1647508043157)(C:\Users\27670\AppData\Roaming\Typora\typora-user-images\image-20220227164323539.png)]

    • 正文(代码段):流程控制,各种算法
    • 初始化的数据(数据段):初始化的数据
    • 未初始化的数据(bss段)
    • 堆:调用malloc,申请空间的操作
    • 栈:局部变量

创建进程

  • 使用fork()函数
    • fork()函数调用成功,返回两次
      • 返回0:子进程
      • 返回非负数(子进程的id):父进程
      • 返回-1:失败
int main()
{
   
        pid_t pid;
        pid = getpid();
        printf("current pid =:%d\n",pid);

        pid = fork();
        if(pid<0)
        {
   
                printf("create failed\n");
        }
        else if(pid==0)
        {
   
                printf("children  pid= %d\n",getpid());
        }
        else
        {
   
                printf("father, pid =%d\n",getpid());
        }
        return 0;
}
   
  • question
    • 以前的linux与现在的linux创建进程时的拷贝的区别
      • 以前:是完完全全的拷贝,所有都拷贝下来
      • 现在:不发生数据变化时,采用共享数据,发送数据变化时,子进程会单独的copy一份,不会影响父进程(写时拷贝)

Vfork

  • 区别
    • vfork直接使用父进程存储空间,不拷贝
    • vfork要保证先运行,当子进程调用exit函数退出后,父进程才执行

进程退出

  • 正常退出
    • main函数调用return
    • 进程调用exit(), ----标准c库
    • 进程调用_exit()或_Exit() —系统调用
    • 进程最后一个线程返回
    • 最后一个线程调用pthread_exit()
  • 异常退出
    • 调用abort
    • 当进程收到某些信号时,如Ctrl+c
    • 最后一个进程取消请求做出的响应

等待子进程退出

  • 子进程退出状态不被收集,会变成僵尸进程
  • 为啥要等待子进程
    • 为了收集子进程的退出状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CzfTiD49-1647508043158)(C:\Users\27670\AppData\Roaming\Typora\typora-user-images\image-20220227200431978.png)]

  • 参数说明
    • status:
      • 非空:子进程退出状态放在它所指向的地址中
      • 空:不关心退出状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AOYBYSeW-1647508043159)(C:\Users\27670\AppData\Roaming\Typora\typora-user-images\image-20220227200545812.png)]

int main()
{
   
        pid_t pid;
        int status=3;
        int cnt =0;
        pid = fork();
        if(pid<0)
        {
   
                wait($status);
                printf("children exit status=%d",WEXITSTATUS(status));
                while(1)
                {
   
                        printf("cnt=%d",cnt);
                        printf("this is father pid=%d\n",getpid());
                        sleep(1);
                }
                printf("create failed\n");
        }
        else if(pid==0)
        {
   
                while(1)
                {
   
                        printf("children  pid= %d\n",getpid());
                        cnt++;
                     	sleep
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值