当前位置: 首页 > news >正文

Linux下的进程操作

进程概念

ps -elf:查看操作系统的所有进程(Linux命令)
ctrl + z:把进程切换到后台
crtl + c:结束进程
fg:把进程切换到前台

获取进程进程号和父进程号

函数原型:

pid_t getpid(void); //pid_t,它是一个有符号整数类型。
pid_t getppid(void);

例子:

#include <stdio.h>                                                                                                                                  
#include <sys/types.h>
#include <unistd.h>int main()
{pid_t pid = getpid();printf("当前进程的进程号为:%d\n", pid);pid_t ppid = getppid();printf("当前进程的父进程为:%d\n", ppid);while(1);return 0;
}

fork

概念:fork() 是一个在操作系统编程中常用的函数,用于创建一个新的进程。它通过复制调用进程(称为父进程)来创建一个新的进程(称为子进程)。子进程是父进程的副本,它从 fork() 函数返回的地方开始执行。
在这里插入图片描述

以下是 fork() 函数的原型:

#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);

fork() 函数没有参数,它返回一个 pid_t 类型的值,表示进程的状态。返回值有以下几种情况:

  • 如果返回值是负数(-1),则表示创建子进程失败。
  • 如果返回值是零(0),则表示当前代码正在子进程中执行。
  • 如果返回值是正数,则表示当前代码正在父进程中执行,返回值是新创建子进程的PID。

例子:

#include <stdio.h>                                                                                                                                  
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>int main()
{       pid_t pid = fork();if(pid == -1){perror("fork");exit(1);}else if(pid == 0){       printf("child pid=%d, getpid=%d, getppid=%d\n", pid, getpid(), getppid());
//      while(1)
//      {printf("child\n");sleep(1);
//      }}else    {       printf("parent pid=%d, getpid=%d, getppid=%d\n", pid, getpid(), getppid());
//      while(1)
//      {printf("parent\n");sleep(2);
//      }}printf("helloworld\n");//会输出两次return 0;
}      

fork笔试题

详情看下述代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{for(int i = 0; i < 2; i++){   fork();//  printf("-\n"); //6个"-",换行符会输出缓冲区里的的数据printf("-"); // 8个"-",子进程会复制父进程输出缓冲区的数据}   return 0;
}

在这里插入图片描述
在这里插入图片描述

fork原理

在这里插入图片描述
下面输出都为1的原因是,父子进程在不同的空间

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{                                                                                                                                                   int num = 0;if(fork() == 0){   num++;printf("child %d\n", num);}   else{   num++;printf("parent %d\n", num);}/*输出为:child 1parent 1*/return 0;}

多进程读写

#include <stdio.h>                                                                                                                                  
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>void child_write(int fd)
{char buf[128] = {0};while(1){scanf("%s", buf);if(write(fd, buf, strlen(buf)) == -1){perror("write");break;}lseek(fd, -1 * strlen(buf), SEEK_CUR);if(!strcmp(buf, "bye"))break;memset(buf, 0, 128);}//i lseek(fd, -1 * strlen(buf), _CUR);}void parent_read(int fd)
{char buf[128] = {0};while(1){int ret = read(fd, buf, sizeof(buf));if(ret == -1){perror("read");break;}else if(ret == 0)continue;if(!strcmp(buf, "bye"))break;printf("child get: %s\n", buf);memset(buf, 0, sizeof(buf));}
}int main()
{int fd = open("hello.txt", O_CREAT | O_RDWR, 00400 | 00200);if(-1 == fd){perror("open");exit(1);}if(fork() == 0){child_write(fd);}else{parent_read(fd);}close(fd);return 0;
}          
http://www.lryc.cn/news/289303.html

相关文章:

  • uniapp scroll-view用法[下拉刷新,触底事件等等...](4)
  • 聊聊大模型 RAG 探索之路的血泪史,一周出Demo,半年用不好
  • UniApp 生命周期详解
  • 用大模型训练实体机器人,谷歌推出机器人代理模型
  • HCIA-HarmonyOS设备开发认证-2.设备开发入门
  • 2. HarmonyOS 应用开发 DevEco Studio 准备-2
  • 【K8S 云原生】K8S的图形化工具——Rancher
  • 3. SQL 语言
  • Android音量调节修改
  • 九州金榜|为什么鼓励式家庭教育?
  • Java复习系列之阶段二:数据库
  • TCP 异常断开连接【重点】
  • Biotin-PEG4-TSA,生物素-PEG4-酪胺,用于标记蛋白质、核酸等生物分子
  • Python环境下基于机器学习的NASA涡轮风扇发动机剩余使用寿命RUL预测
  • Vite学习指南
  • 无人机在三维空间中的转动问题
  • 鸿蒙开发初体验
  • 【Axure教程0基础入门】02高保真基础
  • 【GitHub项目推荐--常见的国内镜像】【转载】
  • 实战 | OpenCV+OCR实现弧形文字识别实例(详细步骤 + 源码)
  • 哪些 3D 建模软件值得推荐?
  • AI论文指南|人大教授教你如何利用ChatGPT革新内容分析!【建议收藏】
  • leetcode 字符串相关题目
  • 第二百九十一回
  • 简化java代码:mapstruct + 策略模式
  • 【Java】SpringMVC路径写法
  • 数据结构之生成树及最小生成树
  • 【java面试】常见问题(超详细)
  • Labview for循环精讲
  • 【STM32】STM32学习笔记-W25Q64简介(37)