学习过程中遇到的问题:
在Linux系统中我们可以通过man 命令来进行查看:
例如:
查看man命令的使用 man man
MANUAL SECTIONS:
The standard sections of the manual include:
1 User Commands
2 System Calls
3 C Library Functions
4 Devices and Special Files
5 File Formats and Conventions
6 Games et. Al.
7 Miscellanea
8 System Administration tools and Daemons
查看exec函数使用 man 3 exec
NAME:(整个exec函数家族)
execl, execlp, execle, execv, execvp - execute a file
SYNOPSIS:
#include (头文件)
extern char **environ;
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[]);
在这里,我们对比这两个函数来进行使用:(其他函数类同)
linux系统中一切皆文件!!!
linux系统中一切皆文件!!!
linux系统中一切皆文件!!!
实例:
使用execlp
#include
#include
int main ()
{
printf("==调用 execl 函数==\n");
execlp("ls","-l","/home/hadoop",(char *)0);
printf("excel error\n");
return 0;
}
使用execlp
#include
#include
int main ()
{
printf("==调用 execl 函数==\n");
execl("/bin/ls","ls","-l","/home/hadoop",(char *)0);
printf("excel error\n");
return 0;
}
对比执行结果,我们发现两个函数执行的结果是相同的。也就是说重点在于使用,其中也不难看出两个函数参数是不一样的,一个调用的是路径,一个直接是文件名。
也是有人会问ls 不是一个指令吗?指令也可以调用?
答案:linux系统中一切皆文件!!!
若还是有疑问,不如自己上机进行实验操作。实践出真知
exec函数是为了在进程中执行一段其他的程序而设置的。
pid=fork();
这句话是创建一个子进程。之后父子进程会分别执行属于代码块。
测试:
pid=fork();
printf("Hello World!");
大家可以看看这句话输出了几次?(自己动手试一下啊!)
由此我们可以知道执行fork()函数会发生这样的事情:
既然有父进程以及子进程之分,那就该想如何才能区分父子进程呢?
fork()函数知识点:
不需要参数并返回一个整数值。下面是fork()返回的不同值。
负值:创建子进程失败。
零: 返回到新创建的子进程。
正值:返回父母或来电者。该值包含新创建的子进程的进程ID。
因此我们可以这样做:
pid=fork();
if(pid == 0)
{
//执行代码
}
if(pid > 0)
{
//执行代码
}
此时,我们的主角 exec函数就登场了:在执行代码部分就可以调用该函数。
实例:
1 #include
2 #include
3 #include
4 #include
5 #include
6 int main()
7 {
8 int fd[2],flag;
9 flag=pipe(fd);
10 if(flag==-1)
11 {
12 printf("pipe creat error\n");
13 exit(-1);
14 }
15 pid_t pid;
16 pid=fork();
17 if(pid==0)
18 {
19 char *mess;
20 read(fd[0],mess,10);
21 printf("pid=%d\n",getpid());
22 printf("play execl:\n");
23 execl("/bin/ls","ls",mess,"/home",(char*)0);
24 printf("excel error\n");
25 }
26 if(pid>0)
27 {
28 char *message;
29 message="-l";
30 //传输参数:-l
31 write(fd[1],message,9);
32 }
33 return 0;
34 }
以上内容涉及到了无名管道,有兴趣的读者可以了解一下。重点是看子进程中的execl函数,若该函数执行成功,则第24行的printf(“excel error\n”);语句不会执行,相反(excel执行失败)会执行。因此子程序中的(excel函数以下)内容会被execl函数执行的内容替代,在该实例中,即
[root@cent0 home]# ls (目录:home 命令:ls <==> execl)
hadoop mydir (是这条语句哦!)
会被该语句覆盖。(动手试一试,也许你会 哇塞,原来是这样啊!)
以上即为今天的内容,希望可以帮助大家。
(小编也是从小白开始的,大家多问,多研究,多动手慢慢就会有思路哦!)
2019/10/26 13:31:49