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

Linux中的进程控制

Linux中的进程控制

(1)C程序示例,使用fork()创建一个子进程:

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <sys/wait.h>  int main() {  pid_t pid;  int status;  int child_return_value;  pid = fork();  if (pid < 0) {  fprintf(stderr, "Fork failed\n");  return 1;  }  if (pid == 0) { // 子进程  printf("I am the child process\n");  printf("My PID is %d\n", getpid());  printf("My parent's PID is %d\n", getppid());  // 从用户输入获取返回值  printf("Enter a return value for the child process: ");  scanf("%d", &child_return_value);  // 退出子进程并返回用户输入的值  printf("Child process exiting...\n");  exit(child_return_value);  } else { // 父进程  printf("I am the parent process\n");  printf("My PID is %d\n", getpid());  printf("My child's PID is %d\n", pid);  // 等待子进程退出  waitpid(pid, &status, 0);  // 检查子进程的退出状态  if (WIFEXITED(status)) {  printf("Child exited with status %d\n", WEXITSTATUS(status));  }  printf("Parent process exiting...\n");  }  return 0;  
}

(2)C程序示例,使用fork()和execvp()(exec函数族中的一个)来执行系统命令ls:

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <sys/wait.h>  int main() {  pid_t pid;  int status;  pid = fork();  if (pid < 0) {  fprintf(stderr, "Fork failed\n");  return 1;  }  if (pid == 0) { // 子进程  // 在这里调用execvp来执行ls命令  char *args[] = {"ls", "-l", NULL};  execvp("ls", args);  // 如果execvp返回,则说明出现了错误  perror("execvp failed");  exit(EXIT_FAILURE);  } else { // 父进程  printf("I am the parent process\n");  printf("My PID is %d\n", getpid());  printf("My child's PID is %d\n", pid);  // 等待子进程退出  waitpid(pid, &status, 0);  // 检查子进程的退出状态  if (WIFEXITED(status)) {  printf("Child exited with status %d\n", WEXITSTATUS(status));  }  printf("Parent process exiting...\n");  }  return 0;  
}

在第二个示例中,execvp函数会替换当前进程的映像为新的进程映像,这个新的进程映像由ls命令指定。如果execvp成功,那么它不会返回;如果它返回,则表明出现了错误,此时子进程会输出错误信息并退出。

请确保你在运行这些示例代码时,拥有相应的系统权限(如执行ls命令的权限),并且你的环境支持这些系统调用。

相关文章:

  • 农业领域科技查新点提炼方法附案例!
  • uniapp原生插件开发实战——Android打开文件到自己的app
  • 数据库设计规范总结
  • windows 下 docker 入门
  • JWT详解、JWTUtil工具类的构建方法
  • 贪心算法学习四
  • 推荐常用的三款源代码防泄密软件
  • Cocos2d-x 4.0 工程首次建立与编译(Mac m1)
  • 利用C#和Snap7工具模拟S7通信(包含DB地址讲解)
  • B端业务需求分析的3大注意事项
  • 栈帧浅析,堆栈漏洞概述——【太原理工大学软件安全期末补充】
  • HarmonyOS开发日记 :自定义节点,实现 UI 组件 动态创建、更新
  • 279 基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计
  • 一文读懂OpenGVLab带来的最新视觉预训练框架
  • 【idea】解决springboot项目中遇到的问题
  • JS 中的深拷贝与浅拷贝
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • ES6核心特性
  • Java IO学习笔记一
  • leetcode46 Permutation 排列组合
  • NSTimer学习笔记
  • swift基础之_对象 实例方法 对象方法。
  • vue-router的history模式发布配置
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 力扣(LeetCode)965
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 入口文件开始,分析Vue源码实现
  • 首页查询功能的一次实现过程
  • 微服务入门【系列视频课程】
  • 学习HTTP相关知识笔记
  • 与 ConTeXt MkIV 官方文档的接驳
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 智能合约Solidity教程-事件和日志(一)
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • postgresql行列转换函数
  • 从如何停掉 Promise 链说起
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • ###STL(标准模板库)
  • #1015 : KMP算法
  • (day18) leetcode 204.计数质数
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (区间dp) (经典例题) 石子合并
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • 、写入Shellcode到注册表上线
  • .cn根服务器被攻击之后
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .Net 访问电子邮箱-LumiSoft.Net,好用