iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux如何启动新进程
  • 799
分享到

Linux如何启动新进程

2023-06-09 16:06:17 799人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关linux如何启动新进程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.system函数-调用shell进程,开启新进程system函数,是通过启动shell进程,然后执行s

这篇文章将为大家详细讲解有关linux如何启动新进程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1.system函数-调用shell进程,开启新进程

system函数,是通过启动shell进程,然后执行shell命令进程。

原型:

int system(const char *string);

string:shell命令字符串

返回值:成功返回命令退出码,无法启动shell,返回127错误码,其他错误,返回-1。

代码示例如下:

process_system.c

#include<stdlib.h>                               #include<stdio.h>int main(){    printf("Running ps with system\n");    int code = system("ps au");//新进程结束后,system函数才返回    //int code = system("ps au");//system函数立即返回    printf("%d\n",code);    printf("ps Done\n");    exit(0);}

输出结果:

Linux如何启动新进程

system函数,在启动新进程时,必须先启动shell进程,因此使用system函数的效率不高。

2.exec系列函数-替换进程映像

exec系列函数调用时,启动新进程,替换掉当前进程。即程序不会再返回到原进程,

除非exec调用失败。

exec启动的新进程继承了原进程的许多特性,如在原进程中打开的文件描述符在新进程中仍保持打开。

需要注意的是,在原进程中打开的文件流在新进程中将关闭。原因在于,我们在前面讲过进程间通信的方式,进程之间需要管道才能通信。

原型:

int execl(const char *path,const char *arg0,...,(char*)0);int execlp(const char *file,const char *arg0,...,(char*)0);int execle(const char *path,const char *arg0,...,(char*)0,char *const envp[]);int execv(cosnt char *path,char *const argv[]);int execvp(cosnt char *file,char *const argv[]);int execve(cosnt char *path,char *const argv[],char *const envp[]);

path/file:进程命令路径/进程命令名

arGC:命令参数列表

envp:新进程的环境变量

代码示例如下:

process_exec.c

#include<stdio.h>int main(){  printf("Running ps with execlp\n");  execlp("ps","ps","au",(char*)0);  printf("ps done");  exit(0);}

输出结果:

Linux如何启动新进程

可以看出,调用execlp函数后,原进程被新进程替换,原进程中printf("ps done");没有被执行到。

3.fork函数-复制进程映像

1)fork函数的使用

fork和exec的替换不同,调用fork函数,可复制一个和父进程一模一样的子进程。

执行的代码也完全相同,但子进程有自己的数据空间,环境和文件描述符。

原型:

pid_t fork();

父进程执行时,返回子进程的PID

子进程执行时,返回0

代码示例如下:

process_fork.c

#include<stdio.h>#include<sys/types.h>int main(){  pid_t pid = fork();  switch(pid)  {    case -1:      perror("fork failed");      exit(1);      break;    case 0:      printf("\n");      execlp("ps","ps","au",0);      break;    default:      printf("parent,ps done\n");      break;  }  exit(0);}

输出结果:

Linux如何启动新进程

调用fork函数后,新建了一个子进程,拷贝父进程的代码,数据等到子进程的内存空间。父进程和子进程执行互不影响。使用fork函数的返回值,来区分执行的是父进程,还是子进程。

2)僵尸进程

子进程退出后,内核会将子进程置为僵尸状态。此时,子进程只保留了最小的一些内核数据结构,如退出码,以便父进程查询子进程的退出状态。这时,子进程就是一个僵尸进程。

在父进程中调用wait或waitpid函数,查询子进程的退出状态,可以避免僵尸进程。

原型:

pid_t wait(int *stat_loc);pid_t waitpid(pid_t pid,int *stat_loc,int options);

stat_loc:若不是空指针,则子进程的状态码会被写入该指针指向的位置。

pid:等待的子进程的进程号pid

options:标记阻塞或非阻塞模式

返回值:成功返回子进程的pid,若子进程没有结束或意外终止,返回0

wait:阻塞模式(使用了信号量),父进程调用wait时,会暂停执行,等待子进程的结束。

wait调用返回后,子进程会彻底销毁。

waitpid:与wait不同的是,

a.可以表示四种不同的子进程类型

     pid==-1 等待任何一个子进程,此时waitpid的作用与wait相同

  pid >0 等待进程ID与pid值相同的子进程

  pid==0 等待与调用者进程组ID相同的任意子进程

  pid<-1 等待进程组ID与pid绝对值相等的任意子进程

b.当options的值为WNOHANG时,为非阻塞模式,即waitpid会立即返回

此时,可以循环查询子进程的状态,若子进程未结束,waitpid返回,做其他工作。

这样提高了程序的效率。

wait函数使用示例如下:

process_fork3.c

#include<wait.h>#include<stdio.h>#include<sys/types.h>int main(){  pid_t pid = fork();  int stat = 0;  switch(pid)  {    case -1:      perror("fork failed");      exit(1);      break;    case 0:      printf("\n");      exit(0);      break;    default:      pid = wait(&stat);      printf("Child has finished:PID=%d\n",pid);      printf("parent,ps done\n");      break;  }  exit(0);}

输出结果:

Linux如何启动新进程

waitpid函数使用示例如下:

process_fork2.c

#include<wait.h>#include<stdio.h>#include<sys/types.h>int main(){  pid_t pid = fork();  int stat = 0;  switch(pid)  {    case -1:      perror("fork failed");      exit(1);      break;    case 0:      printf("\n");      execlp("ps","ps","au",0);      break;    default:      do      {        pid = waitpid(pid,&stat,WNOHANG);        if(pid==0)        {          printf("parent do something else.\n");          sleep(1);        }      }while(pid==0);      printf("Child has finished:PID=%d\n",pid);      printf("parent,ps done\n");      break;  }  exit(0);}

输出结果:

Linux如何启动新进程

4.启动新进程三种方法的比较

1)system函数最简单,启动shell进程,并在shell进程中执行新的进程。

效率不高,system函数必须等待子进程返回才能接着执行。

2)exec系列函数用新进程替换掉原进程,但不会返回到原进程,除非调用失败。

该函数继承了许多原进程的特性,效率也较高。

3)fork函数,复制一个子进程,和父进程一模一样,但是拥有自己的内存空间。父子进程执行互不影响。需要注意僵尸子进程的问题。

关于“Linux如何启动新进程”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Linux如何启动新进程

本文链接: https://www.lsjlt.com/news/256735.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux如何启动新进程
    这篇文章将为大家详细讲解有关Linux如何启动新进程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.system函数-调用shell进程,开启新进程system函数,是通过启动shell进程,然后执行s...
    99+
    2023-06-09
  • Linux中如何启动新进程
    这篇文章给大家分享的是有关Linux中如何启动新进程的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、system函数调用system函数的原型为:#include <stdlib.h>&n...
    99+
    2023-06-09
  • ubuntu如何重新启动进程
    ubuntu重新启动进程的方法:例如要重启mogodb的进程,操作步骤如下:终端输入以下命令查看:# ps -ef | grep mogodb//获得PIDroot 2928 2903 0 14:51 pts/0 00:00:00 grep...
    99+
    2022-10-25
  • Linux启动新进程的三种方法
    程序中,我们有时需要启动一个新的进程,来完成其他的工作。 下面介绍了三种实现方法,以及这三种方法之间的区别。 1.system函数-调用shell进程,开启新进程 system函数,是通过启动shell进程...
    99+
    2022-06-04
    三种 进程 方法
  • Linux守护进程如何启动
    本文小编为大家详细介绍“Linux守护进程如何启动”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux守护进程如何启动”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。&quo...
    99+
    2022-10-19
  • 如何启动Linux的守护进程
    这篇文章主要介绍“如何启动Linux的守护进程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何启动Linux的守护进程”文章能帮助大家解决问题。Linux Daemon(守护进程)是运行在后台的一...
    99+
    2023-06-27
  • Linux中守护进程如何启动
    这篇文章将为大家详细讲解有关Linux中守护进程如何启动,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任...
    99+
    2023-06-27
  • Linux启动新进程的几种方法及比较
    有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及...
    99+
    2022-06-04
    几种方法 进程 Linux
  • ubuntu进程怎么重新启动
    这篇文章主要介绍“ubuntu进程怎么重新启动”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ubuntu进程怎么重新启动”文章能帮助大家解决问题。例如要重启mogodb的进程,操作步骤如下:终端输入...
    99+
    2023-07-04
  • linux守护进程怎么启动
    在Linux中,守护进程的启动通常有以下几种方式: 使用命令行启动:在终端中使用命令行启动守护进程,例如: ./daemon ...
    99+
    2023-10-23
    linux
  • Linux进程启动方式有哪些
    这篇文章主要讲解了“Linux进程启动方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux进程启动方式有哪些”吧! ...
    99+
    2023-02-13
    linux
  • Linux进程怎么创建和启动
    本篇内容主要讲解“Linux进程怎么创建和启动”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux进程怎么创建和启动”吧!进程的类型在 Linux 中主要有两种类型的进程:前台进程(也称为交...
    99+
    2023-06-27
  • linux怎么查看进程启动时间
    在Linux系统中,可以使用ps命令查看进程的启动时间。具体的命令格式如下:```ps -eo pid,lstart,cmd```其...
    99+
    2023-08-29
    linux
  • php如何启动多个进程
    要启动多个进程,可以使用PHP的多进程库如pcntl或posix。使用pcntl库启动多个进程的一种方法如下:1. 创建一个主进程,...
    99+
    2023-08-25
    php
  • C# 中如何启动AutoCAD进程
    今天就跟大家聊聊有关C# 中如何启动AutoCAD进程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C#语言还是比较常见的东西,这里我们主要介绍启动C# AutoCAD进程,包括介绍...
    99+
    2023-06-17
  • linux如何启动mongodb
    这篇文章主要为大家分析了linux如何启动mongodb的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“linux如何启动mongodb”的知识吧。Mongo...
    99+
    2023-06-28
  • linux如何启动mysql
    这篇文章主要介绍了linux如何启动mysql,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。linux如何启动mysql?1. 可以通...
    99+
    2022-10-18
  • linux如何启动redis
    这篇文章主要介绍linux如何启动redis,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、首先为了方便管理,将Redis文件中的conf配置文件和常用命令移动到统一文件中。(1)...
    99+
    2022-10-18
  • Linux如何启动zookeeper
    这篇文章主要介绍“Linux如何启动zookeeper”,在日常操作中,相信很多人在Linux如何启动zookeeper问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux如何启动zookeeper”的疑...
    99+
    2023-06-28
  • MySQL怎么在linux中重新启动
    这篇文章主要讲解了“MySQL怎么在linux中重新启动”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL怎么在linux中重新启动”吧! ...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作