Linux:进程

冯诺依曼

  • 程序和数据都以二进制存储在存储器中,存放在存储器的位置由存储器指定。
  • 计算机工作的时候能够自动从存储器中取出指令然后执行。
    在这里插入图片描述

进程

进程是操作系统分配时间片、内存等资源的基本单位(最小单位),每个进程都有自己的状态、有独立的地址空间。

  • 程序:代码 + 数据
  • 进程:代码 + 数据 + PCB(操作系统通过PCB感知一个进程的存在,PCB能够将代码和数据有效地整合)
  • ps aux 查看进程状态

linux的进程状态:

  • R 正在运行或就绪
  • S 可中断的睡眠状态
  • D 不可中断睡眠
  • Z 僵尸状态
  • T 停止状态

创建进程fork():

  1. 给进程分配pid,创建PCB
  2. 复制父进程的环境
  3. 为新进程分配资源
  4. 拷贝父进程的地址时间内容
  5. 放入就绪队列

fork()

创建一个子进程,一次调用两次返回,父进程的返回值是子进程的的进程id,子进程的返回值是0。

 //创建一个进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 int main(void){
     printf("before fork()\n");
     pid_t pid = fork();//-->创建进程
     if(pid == 0){
         printf("child porcess: gtepid() = %d, return value = %d\n", getpid(), pid);
     }else{
         printf("parent porcess: gtepid() = %d, return value = %d\n", getpid(), pid);
     } 
     getchar();
 }
 //运行结果
/*
before fork()
parent porcess: gtepid() = 3944, return value = 3945
child porcess: gtepid() = 3945, return value = 0
*/

多进程调试:set-fllow-mode parent/child (默认走父进程)

//设置进程之跑固定CPU上
 #define _GNU_SOURCE
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <sched.h>
 
 int main(void){
     cpu_set_t cpu;
 
      pid_t pid = fork();
      if(pid == 0){
          CPU_ZERO(&cpu);//把cpu变量清空
          CPU_SET(0, &cpu);//把变量cpu放到0号cpu上
          sched_setaffinity(0, sizeof(cpu_set_t), &cpu);//设置进程之跑固定CPU上
         while (1){
         }
     }else{
         CPU_ZERO(&cpu);
         CPU_SET(1, &cpu);
         sched_setaffinity(0, sizeof(cpu_set_t), &cpu);
         while (1){
         }
     }
 }

错误处理

  • int setjmp(jmp_buf env);保存程序堆栈信息的上下文到变量env,首次调用返回值为0
  • void longjmp(jmp_buf env, int val);恢复env保存的点,并设置setjmp()的返回值为val
  • char *strerror(int errnum);返回错误号的字符串
#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
 
jmp_buf buf;
 
void func(int s){
    printf("func(int s)\n");
    if (s == 1){
         longjmp(buf, 1);//跳回20行,setjmp(buf))返回值变为1
     }

	printf("fun finsh\n");
}
 
int main(void){
	 int r;
	 printf("int main(void)\n");
 
     if ((r = setjmp(buf)) == 0){//首次调用返回值为0
         func(1);
     }else if (r == 1){
         printf("exception 1\n");
     }

     printf("main finish\n");
}
/*运行结果
int main(void)
func(int s)
exception 1
main finish
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值