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

重庆网站设计重庆最加科技中国摄影网站有哪些

重庆网站设计重庆最加科技,中国摄影网站有哪些,新媒体网络营销的概念,设计工作室怎么找客户引言 想象这样一个场景: 你的服务器需要同时处理数百个用户请求 每个请求都需要独立的安全沙箱环境 突然某个服务崩溃,但系统必须确保其他服务不受影响 这背后涉及的关键机制就是进程管理。本文将深入探讨进程的创建、终止、等待和程序替换&#xf…
引言

想象这样一个场景:

  • 你的服务器需要同时处理数百个用户请求

  • 每个请求都需要独立的安全沙箱环境

  • 突然某个服务崩溃,但系统必须确保其他服务不受影响

这背后涉及的关键机制就是进程管理。本文将深入探讨进程的创建、终止、等待和程序替换,带你全面理解操作系统的进程管理艺术。


一、进程创建:从 fork() 到 clone()

1. fork() 系统调用
  • 功能:创建当前进程的副本

  • 特点

    • 子进程获得父进程地址空间的拷贝

    • 写时复制(Copy-on-Write)优化性能

    • 返回两次:父进程返回子进程PID,子进程返回0

示例

#include <unistd.h>
#include <stdio.h>int main() {pid_t pid = fork();if (pid == 0) {printf("Child process: PID=%d\n", getpid());} else {printf("Parent process: PID=%d, Child PID=%d\n", getpid(), pid);}return 0;
}
2. clone() 系统调用
  • 功能:更灵活的进程创建方式

  • 特点

    • 可选择共享地址空间、文件描述符等

    • 常用于实现线程(如pthread库)

示例

#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>int child_func(void *arg) {printf("Child process: PID=%d\n", getpid());return 0;
}int main() {char stack[1024 * 1024];  // 1MB stackpid_t pid = clone(child_func, stack + sizeof(stack), CLONE_VM | CLONE_FS | CLONE_FILES, NULL);printf("Parent process: PID=%d, Child PID=%d\n", getpid(), pid);return 0;
}

二、进程终止:优雅退出的艺术

1. 正常终止
  • exit():标准库函数,执行清理后调用 _exit()

  • _exit():系统调用,立即终止进程

  • return:从 main() 返回,相当于调用 exit()

示例

#include <stdlib.h>
#include <stdio.h>void cleanup() {printf("Cleaning up...\n");
}int main() {atexit(cleanup);  // 注册退出处理函数printf("Main function\n");exit(EXIT_SUCCESS);
}
2. 异常终止
  • 信号:如 SIGKILL(强制终止)、SIGSEGV(段错误)

  • abort():生成 SIGABRT 信号终止进程

示例

#include <signal.h>
#include <stdio.h>void handler(int sig) {printf("Caught signal %d\n", sig);exit(1);
}int main() {signal(SIGINT, handler);  // 捕获Ctrl+Cwhile (1) {printf("Running...\n");sleep(1);}return 0;
}

三、进程等待:父进程的责任

1. wait() 与 waitpid()
  • 功能:等待子进程状态改变

  • 区别

    • wait() 等待任意子进程

    • waitpid() 可指定特定子进程

示例

#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>int main() {pid_t pid = fork();if (pid == 0) {sleep(2);printf("Child exiting\n");exit(123);} else {int status;waitpid(pid, &status, 0);if (WIFEXITED(status)) {printf("Child exited with code %d\n", WEXITSTATUS(status));}}return 0;
}
2. 僵尸进程处理
  • 原因:子进程终止但父进程未调用 wait()

  • 解决方案

    • 父进程及时调用 wait()

    • 使用 SIGCHLD 信号处理程序

示例

#include <signal.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>void handler(int sig) {while (waitpid(-1, NULL, WNOHANG) > 0);
}int main() {signal(SIGCHLD, handler);pid_t pid = fork();if (pid == 0) {printf("Child running\n");sleep(2);exit(0);} else {while (1) {printf("Parent running\n");sleep(1);}}return 0;
}

四、进程程序替换:exec 家族

1. exec 函数族
函数参数传递方式环境变量处理
execl()参数列表继承当前环境
execv()参数数组继承当前环境
execle()参数列表指定新环境
execve()参数数组指定新环境
execlp()参数列表,在PATH中查找程序继承当前环境
execvp()参数数组,在PATH中查找程序继承当前环境

示例

#include <unistd.h>
#include <stdio.h>int main() {printf("Before exec\n");execl("/bin/ls", "ls", "-l", NULL);perror("exec failed");  // 如果exec成功,这行不会执行return 1;
}
2. 综合示例:fork + exec
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>int main() {pid_t pid = fork();if (pid == 0) {execlp("python3", "python3", "-c", "print('Hello from Python')", NULL);perror("execlp failed");_exit(1);} else {int status;waitpid(pid, &status, 0);if (WIFEXITED(status)) {printf("Child exited with code %d\n", WEXITSTATUS(status));}}return 0;
}

五、高级话题与性能优化

1. 进程 vs 线程
特性进程线程
地址空间独立共享
创建开销较大较小
通信方式IPC(管道、共享内存等)共享变量
容错性高(一个进程崩溃不影响其他)低(一个线程崩溃影响整个进程)
2. 写时复制(Copy-on-Write)
  • 原理:fork() 时不立即复制内存,仅在写入时复制

  • 优点:大幅减少 fork() 开销

  • 应用

    • 快速创建子进程

    • 实现高效的进程快照


六、实战案例:实现一个简单的 Shell

#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_ARGS 64void parse_command(char *cmd, char **args) {int i = 0;args[i++] = strtok(cmd, " ");while ((args[i++] = strtok(NULL, " ")) ;
}int main() {char cmd[256];char *args[MAX_ARGS];while (1) {printf("mysh> ");if (!fgets(cmd, sizeof(cmd), stdin)) break;cmd[strcspn(cmd, "\n")] = 0;  // 去除换行符parse_command(cmd, args);pid_t pid = fork();if (pid == 0) {execvp(args[0], args);perror("execvp failed");_exit(1);} else {int status;waitpid(pid, &status, 0);if (WIFEXITED(status)) {printf("Process exited with code %d\n", WEXITSTATUS(status));}}}return 0;
}
结语

通过本文的学习,你已经掌握了进程管理的核心概念和关键技术。无论是开发高性能服务器,还是编写系统工具,这些知识都将成为你的强大武器。记住,理解进程的本质不仅有助于编写更好的代码,更能深入理解操作系统的设计哲学。


文章转载自:

http://T0ql11hU.qLrwf.cn
http://T74zhAq9.qLrwf.cn
http://o1oap6Rx.qLrwf.cn
http://xJZtufHT.qLrwf.cn
http://Zx7gzY8X.qLrwf.cn
http://jhCIwpjJ.qLrwf.cn
http://9ym7y25Z.qLrwf.cn
http://cOSAn4Eu.qLrwf.cn
http://2BggCQdq.qLrwf.cn
http://WvfKFO5E.qLrwf.cn
http://Cvv3EbcM.qLrwf.cn
http://jpHVeyMn.qLrwf.cn
http://Vws0JVC5.qLrwf.cn
http://uZbZS5pO.qLrwf.cn
http://ALoLlRJO.qLrwf.cn
http://VVZHBL3a.qLrwf.cn
http://oHcoQ5zd.qLrwf.cn
http://UlQS2hQz.qLrwf.cn
http://5BhRQJ5a.qLrwf.cn
http://oar7K8IG.qLrwf.cn
http://gkL17hkL.qLrwf.cn
http://rcdjasC6.qLrwf.cn
http://duSxmppG.qLrwf.cn
http://L2UYN2qx.qLrwf.cn
http://R7c4Jo1B.qLrwf.cn
http://9Cc3iKlk.qLrwf.cn
http://HeCOugPg.qLrwf.cn
http://dShDeeOG.qLrwf.cn
http://W0x7qg6c.qLrwf.cn
http://IY4Xl7Ym.qLrwf.cn
http://www.dtcms.com/wzjs/679984.html

相关文章:

  • 百度站长平台快速收录怎么弄免费永久云服务器
  • 火锅网站建设jquery wordpress
  • 南昌正规网站公司吗wordpress 主题重置
  • 深圳做营销网站建设电子商务网站建设与管理相关论文
  • 做的好的手机网站有哪些一个做任务的网站
  • 怎样做好网站建设wordpress 一键分享
  • 乔智云智能建站wordpress最好的中文主题
  • 网站统计分析工具改行做网站
  • 响应式网站的优势有那些的呢网站建设视觉设计
  • 北京做公司网站可以做课程的网站
  • 电商网站为什么要提高网站友好度一键生成app的软件
  • 深圳家具网站建设游戏试玩平台代理
  • 公司域名让做网站的c可以做网站么
  • 网站建设与管理书籍360网站托管
  • 两学一做学习网站网站建设套餐报
  • 白色网站配色网站开发到上线
  • 3建设营销型网站流程图苏宁网站优化与推广
  • 论坛做视频网站2345网址电脑版首页
  • 内江市规划建设教育培训 网站深圳推广软件十年乐云seo
  • 建设网站叶少泉洛阳网站开发公司
  • 网站的字体深圳装修公司排行榜
  • 一个空间多个网站网站备案审核要多久
  • 德州中文网站建设全国企业名称注册查询
  • 建设信用卡在线海淘网站返现企业网站平台建设咨询合同
  • 江苏建设人才官方网站塑胶模具东莞网站建设
  • 网站做淘宝联盟wordpress首页模板是哪个文件夹
  • 网站源码html沈阳网站建设方案外包
  • 如何做网站专题wordpress防爆破插件
  • 泊头市建设网站网站没备案
  • 峨山网站建设个人网站样式