前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >进程 (二).exec(1)

进程 (二).exec(1)

作者头像
franket
发布2021-09-16 09:43:08
3990
发布2021-09-16 09:43:08
举报
文章被收录于专栏:技术杂记技术杂记

前言

UNIX/Linux 是多任务的操作系统,那如何进行多任务处理呢,就是通过多个进程分别处理不同事务来实现

事实上一颗单核CPU,在一个时刻里只能处理一条指令,所以在微观的世界里只可能有一个进程正在运行,那为什么是多任务的操作系统呢,那是由于操作系统将CPU时间分成很多的小时间片,并且将这些时间片分配给不同的任务,然后根据特定的方法在不同任务间进行快速的轮转(每一次切换任务都会对当前任务的进展进行保存,然后提取出下一个任务之前保存的进展,这个切换过程是有一定CPU开销的),而相对于计算机,人的速度非常慢,这样从宏观来看,给人的感觉就好像很多事务在同时推进一样,从而达到多任务或并行处理的效果,而多核的CPU就可以真实地进行并行处理,就好像多条流水线同时开工,在这里每个任务都可以看作是一个进程

上一篇中使用fork进行了子进程的创建,这时子进程还是一份父进程的拷贝,如果要让子进程可以完成父进程不一样的功能,就要用到进程的替换

进程的替换是通过 exec 函数族来实现的

这里分享一下我在学习进程过程中的笔记和心得


概要


代码示例

要求

  • 1.父进程(程序名process)产生一个子进程,用程序(z)替换
  • 2.父进程等待子进程结束后,父进程才能结束

process进程:process.c

要求:里面sleep 3秒,要求打印出子进程的PID。

z进程:z.c

要求:每2秒打印一句提示语,循环5次。

代码示例

z.c

代码语言:javascript
复制
#include <stdio.h>
#include <unistd.h> //sleep函数在这里面声明

int main()
{
  int i=0;
  for(i=0;i<5;i++)
  {
    sleep(2);
    printf("%d loop...(there are %d times left)\n",i+1,5-i-1);
  }
  return 0;
}

小程序编译测试

代码语言:javascript
复制
emacs@ubuntu:~/c$ alias  gtc
alias gtc='gcc -Wall -g -o'
emacs@ubuntu:~/c$ gtc z.x z.c
emacs@ubuntu:~/c$ ./z.x
1 loop...(there are 4 times left)
2 loop...(there are 3 times left)
3 loop...(there are 2 times left)
4 loop...(there are 1 times left)
5 loop...(there are 0 times left)
emacs@ubuntu:~/c$

编译执行过程中没有报错,从结果来看,符合预期

下面是关键的主程序

process.c

代码语言:javascript
复制
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h> //exit 函数在里面声明

int main()
{
  pid_t fret=0; //创建一个变量用来存放fork返回值

  fret=fork(); 
  if(0 < fret) //如果pe的值大于0,就代表为父进程,fret的值就是子进程的进程号
  {
    int pid=0,status=0;
    
    sleep(3);
    printf("this is the parent process(%d),wait for child(%d)...\n",getpid(),fret); 
    pid = wait(&status); //使用阻塞模式等待子进程退出
    if(-1 !=  pid ) printf("this is the father process, my pid is %d, child process is %d, the wait return value is %d \n",getpid(),fret,WEXITSTATUS(status)); //再次显示父子进程PID,和子进程退出的状态
    else printf("wait error\n");
  }
  else if(0 == fret) //fork返回值为0的时候代表子进程
  {
    char *s="/home/emacs/c/z.x";  //定义一个字符指针存放可执行程序的路径
    char *c="z.x"; //定义一个字符指针存放可执行文件名
    printf ("this is child, pid is :%d, my father pid is %d\n",getpid(),getppid()); //显示父子进程PID信息
    execl(s,c,(char *)0); //进行进程替换, use NULL instead of (char *)0
  } 
  else 
  {
    printf("fork error\n");
    exit(-1); //直接退出,并且将退出状态设置为-1
  }

  return 0;
}

编译执行

代码语言:javascript
复制
emacs@ubuntu:~/c$ alias gtc
alias gtc='gcc -Wall -g -o'
emacs@ubuntu:~/c$ gtc process.x process.c
emacs@ubuntu:~/c$ ./process.x 
this is child, pid is :7588, my father pid is 7587
1 loop...(there are 4 times left)
this is the parent process(7587),wait for child(7588)...
2 loop...(there are 3 times left)
3 loop...(there are 2 times left)
4 loop...(there are 1 times left)
5 loop...(there are 0 times left)
this is the father process, my pid is 7587, child process is 7588, the wait return value is 0 
emacs@ubuntu:~/c$

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 概要
    • 代码示例
      • 要求
      • 代码示例
      • 编译执行
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档