加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux中如何启动新进程

发布时间:2016-10-31 01:25:44 所属栏目:Linux 来源:网络整理
导读:有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供

这类函数可以分为两大类,execl、execlp和execle的参数是可变的,以一个空指针结束,而execv、execvp和execve的第二个参数是一个字符串数组,在调用新进程时,argv作为新进程的main函数的参数。而envp可作为新进程的环境变量,传递给新的进程,从而变量它可用的环境变量。

承接上一个例子,如果想用exec系统函数来启动ps进程,则这6个不同的函数的调用语句为:

注:arg0为程序的名字,所以在这个例子中全为ps。

char *const ps_envp[] = {"PATH=/bin:usr/bin", "TERM=console", 0};  
char *const ps_argv[] = {"ps", "au", 0};  
      
execl("/bin/ps", "ps", "au", 0);  
execlp("ps", "ps", "au", 0);  
execle("/bin/ps", "ps", "au", 0, ps_envp);  
      
execv("/bin/ps", ps_argv);  
execvp("ps", ps_argv);  
execve("/bin/ps", ps_argv, ps_envp);

下面我给出一个完整的例子,源文件名为new_ps_exec.c,代码如下:

#include <unistd.h>  
#include <stdio.h>  
#include <stdlib.h>  
      
int main()  
{  
    printf("Running ps with execlpn");  
    execlp("ps", "ps", "au", (char*)0);  
    printf("ps Done");  
    exit(0);  
}

运行结果如下:

Linux中如何启动新进程

细心的话,可以发现,最后的ps Done并没有输出,这是偶然吗?并不是,因为我们并没有再一次返回到程序new_ps_exec.exe上,因为调用execlp函数时,new_ps_exec.exe进程被替换为ps进程,当ps进程结束后,整个程序就结束了,并没有回到原来的new_ps_exec.exe进程上,原本的进程new_ps_exec.exe不会再执行,所以语句printf("ps Done");根本没有机会执行。

注意,一般情况下,exec函数是不会返回的,除非发生错误返回-1,由exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,但任何在原进程中已打开的目录流都将在新进程中被关闭。

三、复制进程映像——fork函数

1、fork函数的应用

exec调用用新的进程替换当前执行的进程,而我们也可以用fork来复制一个新的进程,新的进程几乎与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境和文件描述符。

fork函数的原型为:

#include <sys/type.h>  
#include <unistd.h>  
      
pid_t fork();

注:在父进程中,fork返回的是新的子进程的PID,子进程中的fork返回的是0,我们可以通过这一点来判断父进程和子进程,如果fork调用失败,它返回-1.

继承上面的例子,下面我给出一个调用ps的例子,源文件名为new_ps_fork.c,代码如下:

#include <unistd.h>  
#include <sys/types.h>  
#include <stdio.h>  
#include <stdlib.h>  
      
int main()  
{  
    pid_t pid = fork();  
    switch(pid)  
    {  
    case -1:  
        perror("fork failed");  
        exit(1);  
        break;  
    case 0:  
        //这是在子进程中,调用execlp切换为ps进程  
        printf("n");  
        execlp("ps", "ps", "au", 0);  
        break;  
    default:  
        //这是在父进程中,输出相关提示信息  
        printf("Parent, ps Donen");  
        break;  
    }  
    exit(0);  
}

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/Linux/

输出结果为:

Linux中如何启动新进程

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读