Linux中如何启动新进程

有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。

一、system函数调用

system函数的原型为:

#include <stdlib.h>
int system (const char *string);

它的作用是,运行以字符串参数的形式传递给它的命令并等待该命令的完成。命令的执行情况就如同在shell中执行命令:sh -c string。如果无法启动shell来运行这个命令,system函数返回错误代码127;如果是其他错误,则返回-1。否则,system函数将返回该命令的退出码。

注意:system函数调用用一个shell来启动想要执行的程序,所以可以把这个程序放到后台中执行,这里system函数调用会立即返回。

可以先先下面的例子,源文件为new_ps_system.c,代码如下:

#include <stdlib.h>
#include <stdio.h>  

int main()
{
    printf("Running ps with system\n");
    //ps进程结束后才返回,才能继续执行下面的代码
    system("ps au");// 1
    printf("ps Done\n");
    exit(0);
}

该程序调用ps程序打印所有与本用户有关的进程,最后才打印ps Done。运行结果如下:

如果把注释1的语句改为:system("ps au &");则system函数立即返回,不用等待ps进程结束即可执行下面的代码。所以你看到的输出,ps Done可能并不是出现在最后一行,而是在中间。

一般来说,使用system函数不是启动其他进程的理想手段,因为它必须用一个shell来启动需要的程序,即在启动程序之前需要先启动一个shell,而且对shell的环境的依赖也很大,因此使用system函数的效率不高。

二、替换进程映像——使用exec系列函数

exec系列函数由一组相关的函数组成,它们在进程的启动方式和程序参数的表达方式上各有不同。但是exec系列函数都有一个共同的工作方式,就是把当前进程替换为一个新进程,也就是说你可以使用exec函数将程序的执行从一个程序切换到另一个程序,在新的程序启动后,原来的程序就不再执行了,新进程由path或file参数指定。exec函数比system函数更有效。

exec系列函数的类型为:

#include <unistd.h>  

char **environ;  

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 (const char *path, char *const argv[]);
int execvp(cosnt char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, 程序
, const相关
, 进程
, char*
, char[]
, const
, system命令
, char
, system
execlp
linux 启动新进程、linux如何启动进程、linux 进程启动时间、linux 启动进程、linux启动进程命令,以便于您获取更多的相关知识。

时间: 2024-12-22 14:19:35

Linux中如何启动新进程的相关文章

分析Linux内核创建一个新进程的过程【转】

转自:http://www.cnblogs.com/MarkWoo/p/4420588.html 前言说明 本篇为网易云课堂Linux内核分析课程的第六周作业,本次作业我们将具体来分析fork系统调用,来分析Linux内核创建新进程的过程 关键词:fork, 系统调用,进程 *运行环境:** Ubuntu 14.04 LTS x64 gcc 4.9.2 gdb 7.8 vim 7.4 with vundle 分析 分析方法说明 PCB包含了一个进程的重要运行信息,所以我们将围绕在创建一个新进程时

在Linux中添加普通新用户

  在Linux中添加普通新用户 ,超级用户(也称为"root")是一个具有修改系统中任何文件权力的特别账号.在日常工作中,最好不要使用超级用户账号进入系统,因为任何错误操作都可能导致巨大的损失.由于超级用户账号是系统建立后提供的惟一一个账号,因此,您需要建立和使用一个一般用户账号进行日常工作. 超级用户可以创建新的用户账号,下面的命令将建立一个名为joe的新用户: # adduser joe # passwd joe (键入joe的口令) Linux采用了将系统管理员和一般用户分开的

linux中myecplise启动tomcat报错

问题描述 linux中myecplise启动tomcat报错 我装了myeclipse2014和tomcat8.0和jdk1.8,jdk安装无任何问题,但是启动tomcat时就报错我是linux菜鸟新手,希望大神帮助,给个详细的解决办法,谢谢!: 二月 21, 2015 9:01:21 下午 org.apache.catalina.valves.AccessLogValve open 严重: Failed to open access log file [/home/snow/soft/tomc

linux中chkconfig 启动程序顺序

  1)redhat的启动方式和执行次序是: 加载内核 执行init程序 /etc/rc.d/rc.sysinit # 由init执行的第一个脚本 /etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式 /etc/rc.d/rc.local #相应级别服务启动之后.在执行该文件(其实也可以把需要执行的命令写到该文件中) /sbin/mingetty # 等待用户登录 在Redhat中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包

linux中chkconfig 启动程序顺序介绍

1)redhat的启动方式和执行次序是: 加载内核 执行init程序 /etc/rc.d/rc.sysinit          # 由init执行的第一个脚本 /etc/rc.d/rc $RUNLEVEL  # $RUNLEVEL为缺省的运行模式 /etc/rc.d/rc.local             #相应级别服务启动之后.在执行该文件(其实也可以把需要执行的命令写到该文件中) /sbin/mingetty # 等待用户登录 在Redhat中,/etc/rc.d/rc.sysinit主

linux中使用 supervisor 管理进程

一,supervisor 简介 通常我们要启动一个服务时,例如 nginx,一般使用 service nginx start 或者 /etc/init.d/nginx start ,但是当系统运行多个服务时,一个个启动与停止则很麻烦,当服务故障时,还得手动进行重启,supervisor 正好能解决这些问题,supervisor 是一个用 Python 写的 C/S 进程管理工具,可以很方便的用来启动.重启.关闭进程,在批量服务化管理时特别有效,可以对多个进程同时进行管理并且可以监控进程,当某个服

linux中使用Monit监控进程与系统状态

但现实是残酷的,不少软件本身的稳定性有待提升,机器的硬件资源提升会触及成本,因此在集群的环境中,具备冗余,使得执行简单的服务重启成为了最现实的选择. 这本身不是什么困难的事情,实现的方法有很多,比如在Zabbix或Nagios的报警中增加Action或Commands,或自己写脚本放到计划任务中执行都可以. 但本文要介绍的,是专门来做这种事情的一个工具:Monit. 它最大的特点是配置文件简单易读,同时支持进程和系统状态的监控,并灵活的提供了各种检测的方式,周期,并进行报警和响应(重启服务,执行

linux中resin启动shell脚本

代码如下  代码如下 复制代码 [root@client01 ~]# cat /etc/init.d/resind     #!/bin/sh       #created by teddylu at 2014-12-12   #used to startup for resin version 3.1   #chkconfig: 345 85 15     #set up environment variable to fix the failure of resin automatical

linux中haproxy启动脚本共享

#!/bin/bash   #created by teddylu on 2014-1-15   #used for haproxy-1.4.26   BASE="/application/haproxy"   PROG=$BASE/sbin/haproxy   PIDFILE=$BASE/var/run/haproxy.pid   CONFFILE=$BASE/conf/haproxy.conf       case "$1" in   start)