进程控制(创建,等待,终止)

  • 创建进程(fork)
  • 进程的等待(wait)
  • 进程终止(exit)
  • 封装fork/wait
1.创建进程(fork)

fork的运行规则:

  • 以父进程为模板,创建子进程
  • fork会把父进程的PCB拷贝一份,稍加修改成为子进程的PCB
  • fork会把父进程的虚拟地址空间拷贝一份,作为子进程的虚拟地址空间
  • 父子进程会共用一份代码和数据,如果发生修改会给拷贝一份数据(写时拷贝)
  • fork有两个返回值 父进程返回子进程的pid,子进程返回0,在fork之后分别继续执行
2.进程的等待(wait/waitpid)

进程等待的必要性:

  • 如果子进程退出,父进程不关心就会导致僵尸进程,内存泄漏问题
  • 如果导致僵尸进程,kill -9都不会杀死,因为谁也没办法杀死一个已经死去的进程
  • 父进程要知道交代子进程的任务完成的怎么样了
  • 父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息
3.进程终止

正常退出:

  • 代码执行完的情况
  • 1.main()函数返回 能刷新缓冲区
    0-------正确 非0 -------错误
  • 2.exit 库函数 本质是调用_exit exit结束前会关闭所有流再调用_exit
  • 3._exit 进程退出 系统调用

异常退出:

  • ctrl+c 信号终止
4.封装fork/wait

编写函数 process_create(pid_t* pid, void* func, void* arg), func回调函数就是子进程执行的入口函数, arg是传递给func回调函数的参数.

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>

typedef void (*FUNC)(void *);
void func(void* arg)
{
  printf("%s\n",arg);
}

void process_create(pid_t* pid, void* func,char* arg)
{
 *pid = fork();
 
 if(*pid<0){
   perror("error");
   exit(-1);
 }
 else if(*pid == 0){
   //child
      FUNC funct = (FUNC)func;
      funct(arg);
      sleep(5);
}
 else{
   //father
   pid_t ret = wait(NULL);
   printf("chirld: %d\n",ret);
 }
}
int main()
{
  pid_t pid;
  char* arg = "child";
  
  process_create(&pid,func,arg);
  return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 创建进程 CreateProcess() 调用的核心参数是可执行文件运行时的文件名及其命令行。下表详细地列出了每个参数的类型和名称。 CreateProcess() 函数的参数 2. 正在运行的进程 如果一个进程拥有至少一个执行线程,则为正在系统中运行的进程。当调用ExitProcess() API函数,通知系统终止它所拥有的所有正在运行、准备运行或正在挂起的其他线程。当进程正在运行时,可以查看它的许多特性。 首先可利用GetCurrentProcessId() 函数来查看的进程特性是进程标识符 (PID),返回的PID在整个系统中都可使用。其他的可显示当前进程信息的API函数如GetStartupInfo()和GetProcessShutdownParameters() 可给出进程的配置信息。 通常,一个进程需要它的运行期环境的信息。例如API函数GetModuleFileName() 和GetCommandLine() ,可以给出用在CreateProcess() 中的参数以启动应用程序。 用GetGuiResources() 来查看进程的GUI资源。此函数既可返回指定进程中的打开的GUI对象的数目,也可返回指定进程中打开的USER对象的数目。进程的其他性能信息可通过GetProcessIoCounters()、GetProcessPriorityBoost() 、GetProcessTimes()、GetProcessWorkingSetSize() 和GetProcessVersion()得到。 3. 终止进程 所有进程都是以调用ExitProcess() 或者TerminateProcess() 函数结束的。最好用前者而不要用后者,因为进程是在完成了它的所有的关闭任务之后以正常的终止方式来调用前者的。而外部进程通常调用后者即突然终止进程的进行,由于关闭时的途径不太正常,有可能引起错误的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值