设为首页 加入收藏

TOP

Linux下进程的建立
2014-11-24 08:24:40 来源: 作者: 【 】 浏览:1
Tags:Linux 进程 建立

我们都知道,进程就是正在执行的程序。而在Linux中,可以使用一个进程来创建另外一个进程。这样的话,Linux的进程的组织结构其实有点像Linux目录树,是个层次结构的,可以使用pstree命令来查看。在最上面是init程序的执行进程。它是所有进程的老祖宗。Linux提供了两个函数来创建进程。

1.fork()

fork()提供了创建进程的基本操作,可以说它是Linux系统多任务的基础。该函数在unistd.h库中声明。  
#include


#include


#include



int main()


{


printf( "创建进程前\n" );


pid_t pid = fork();



if( !pid ){


printf( "我是子进程哟,我的PID是:%d\n" ,getpid() );


}else if( pid>0 ){


printf( "我是父进程,我的PID是:%d,我的子进程PID是:%d\n",getpid(),pid );


}else{


printf( "创建进程失败了哟\n" );


exit(1);


}



return 1;


}



  在调用fork()之前,只有一个进程,但是fork()之后,将产生一个该进程的子进程,该子进程完全复制父进程,此时父子两个进程同时运行。在fork()的时候,如果返回的是0,则说明该进程是子进程。如果返回大于0则说明是父进程。如果小于0(其实是-1),则说明创建进程失败了。

  每个进程都有一个唯一标示符,即PID,可以使用getpid()来获取。父进程返回的pid其实是子进程的pid。

  貌似这样看,fork()之后也没有什么作用。其实不然,如果fork()之后跟其他linux功能使用,还是用处很大的。比如我们可以在父子进程中通过通信协议来通信,就可以协同完成一些任务了。

2.exec系列函数

  如果只有fork(),肯定是不完美的,因为fork()只能参数一个父进程的副本。而exec系列函数则可以帮助我们建立一个全新的新进程。


int execl( const char *path, const char *arg, ...);


int execlp( const char *file, const char *arg, ...);


int execle( const char *path, const char *arg , ..., char* const envp[]);


int execv( const char *path, char *const argv[]);


int execvp( const char *file, char *const argv[]);



以上函数在unistd.h声明。

下面我们以execl()函数为例:


#include


#include



int main()


{


execl("/bin/ls","ls","-l",NULL);



printf("如果execl执行失败,这个就会打印出来了\n");


return 1;


}


该程序运行到execle()时,载入ls程序,并且覆盖当前程序的空间。这样就参数了一个新的进程,但是注意,这个新进程的PID跟载入它的进程是一样的。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Hive下UDF函数的使用 下一篇Linux shell编程

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 数据分析与可 (2025-12-26 21:51:20)
·从零开始学Python之 (2025-12-26 21:51:17)
·超长干货:Python实 (2025-12-26 21:51:14)
·为什么 Java 社区至 (2025-12-26 21:19:10)
·Java多线程阻塞队列 (2025-12-26 21:19:07)