Linux下进程的创建
来源:互联网 发布:js set array 转换 编辑:程序博客网 时间:2024/05/29 15:31
我们都知道,进程就是正在执行的程序。而在Linux中,可以使用一个进程来创建另外一个进程。这样的话,Linux的进程的组织结构其实有点像Linux目录树,是个层次结构的,可以使用pstree命令来查看。在最上面是init程序的执行进程。它是所有进程的老祖宗。Linux提供了两个函数来创建进程。
1.fork()
fork()提供了创建进程的基本操作,可以说它是Linux系统多任务的基础。该函数在unistd.h库中声明。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
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 <stdio.h>
#include <unistd.h>
int
main()
{
execl(
"/bin/ls"
,
"ls"
,
"-l"
,NULL);
printf
(
"如果execl执行失败,这个就会打印出来了\n"
);
return
1;
}
3.fork()和exec()一起调用
fork()可以创建子进程,但是子进程只是父进程的副本。我们可以利用exec()函数在子进程来重新载入一个全新的进程。下面看一个两个函数联用的列子。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main()
{
pid_t pid = fork();
switch
( pid )
{
case
0:
printf
(
"子进程\n"
);
execl(
"/bin/ls"
,
"ls"
,
"-l"
,NULL);
case
-1:
printf
(
"fork失败了\n"
);
exit
(1);
default
:
wait(NULL);
printf
(
"完成了哟!\n"
);
exit
(0);
}
}
- Linux下进程的创建
- linux下的进程创建
- Linux下进程的创建
- linux程序设计入门----进程介绍:linux下进程的创建
- Linux下守护进程的创建
- Linux下守护进程的创建
- Linux下守护进程的创建过程
- Linux下守护进程的创建例子
- linux下的简单进程创建
- linux系统下进程的创建
- linux下进程的创建和等待
- Linux 下创建守护进程
- Linux进程的创建
- Linux进程的创建
- Linux进程的创建
- linux下的创建子进程的方法
- Linux下C语言编程-进程的创建
- Linux下C语言编程-进程的创建
- 北京SEO祭司:天天更新网站内容怎么还没排名?
- easy-ui插件收获
- 第三章 RDD编程
- 二叉树的建立,以及递归前中后序遍历二叉树
- banner实现流+网络获取图片设置
- Linux下进程的创建
- 软件工程核心思想总结
- Android OTA系统升级---原理三
- FZU 1894 志愿者选拔 单调队列 题解
- Python的序列
- 如何在plsql中终止存储过程的执行
- 最大似然估计和最小二乘估计的区别与联系
- 北京SEO祭司:百度蜘蛛的工作方式
- Java集合之collection体系