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

Linux中如何启动新进程

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

2、等待一个进程

wait函数和waitpid函数的原型为:

#include <sys/types.h>  
#include <sys/wait.h>  
      
pid_t wait(int *stat_loc);  
pid_t waitpid(pid_t pid, int *stat_loc, int options);

wait用于在父进程中调用,让父进程暂停执行等待子进程的结束,返回子进程的PID,如果stat_loc不是空指针,状态信息将被写入stat_loc指向的位置。

waitpid等待进程id为pid的子进程的结束(pid为-1,将返回任一子进程的信息),stat_loc参数的作用与wait函数相同,options用于改变waitpid的行为,其中有一个很重要的选项WNOHANG,它的作用是防止waippid调用者的执行挂起。如果子进程没有结束或意外终止,它返回0,否则返回子进程的pid。

改变后的程序保存为源文件new_ps_fork2.c,代码如下:

#include <unistd.h>  
#include <sys/types.h>  
#include <stdio.h>  
#include <stdlib.h>  
      
int main()  
{  
    pid_t pid = fork();  
    int stat = 0;  
    switch(pid)  
    {  
    case -1:  
        perror("fork failed");  
        exit(1);  
        break;  
    case 0:  
        //这是在子进程中,调用execlp切换为ps进程  
        printf("n");  
        execlp("ps", "ps", "au", 0);  
        break;  
    default:  
        //这是在父进程中,等待子进程结束并输出相关提示信息  
        pid = wait(&stat);  
        printf("Child has finished: PID = %dn", pid);  
        //检查子进程的退出状态  
        if(WIFEXITED(stat))  
            printf("Child exited with code %dn", WEXITSTATUS(stat));  
        else
            printf("Child terminated abnormallyn");  
        printf("Parent, ps Donen");  
        break;  
    }  
    exit(0);  
}

输出为:

Linux中如何启动新进程

可以看到这次的输出终于正常了,Parent的输出也在子进程的输出之后。

总结——三种启动新进程方法的比较

首先是最简单的system函数,它需要启动新的shell并在新的shell是执行子进程,所以对环境的依赖较大,而且效率也不高。同时system函数要等待子进程的返回才能执行下面的语句。

exec系统函数是用新的进程来替换原先的进程,效率较高,但是它不会返回到原先的进程,也就是说在exec函数后面的所以代码都不会被执行,除非exec调用失败。然而exec启动的新进程继承了原进程的许多特性,在原进程中已打开的文件描述符在新进程中仍将保持打开,但需要注意,任何在原进程中已打开的目录流都将在新进程中被关闭。

fork则是用当前的进程来复制出一个新的进程,新进程与原进程一模一样,执行的代码也完全相同,但新进程有自己的数据空间、环境变量和文件描述符,我们通常根据fork函数的返回值来确定当前的进程是子进程还是父进程,即它并不像exec那样并不返回,而是返回一个pid_t的值用于判断,我们还可以继续执行fork后面的代码。感觉用fork与exec系列函数就能创建很多需的进程。

(编辑:佛山站长网)

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

热点阅读