exec函数的使用问题

进程中关于exec函数的使用问题

学习过程中遇到的问题:

  • 如何使用?
  • 有什么区别?
  • 作用是什么?

1.如何使用?

在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 <unistd.h>(头文件)

   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[]);

2.有什么区别?

  • 函数名不同(这是废话)
  • 参数不同
  • 使用方法不同

在这里,我们对比这两个函数来进行使用:(其他函数类同)

  • int execl(const char *path, const char *arg, …);
  • int execlp(const char *file, const char *arg, …);

linux系统中一切皆文件!!!

linux系统中一切皆文件!!!

linux系统中一切皆文件!!!

实例:

使用execlp

 #include<stdio.h>
 #include<unistd.h>
 int main ()
 {
  printf("==调用 execl 函数==\n");
  execlp("ls","-l","/home/hadoop",(char *)0);
  printf("excel error\n");
  return 0;
 }

使用execlp

 #include<stdio.h>
 #include<unistd.h>
 int main ()
 {
  printf("==调用 execl 函数==\n");
  execl("/bin/ls","ls","-l","/home/hadoop",(char *)0);
  printf("excel error\n");
  return 0;
 }  

对比执行结果,我们发现两个函数执行的结果是相同的。也就是说重点在于使用,其中也不难看出两个函数参数是不一样的,一个调用的是路径,一个直接是文件名

也是有人会问ls 不是一个指令吗?指令也可以调用?

答案:linux系统中一切皆文件!!!

若还是有疑问,不如自己上机进行实验操作。实践出真知

3.作用是什么?

exec函数是为了在进程中执行一段其他的程序而设置的。

pid=fork();

这句话是创建一个子进程。之后父子进程会分别执行属于代码块。

测试:

pid=fork();
printf("Hello World!");

大家可以看看这句话输出了几次?(自己动手试一下啊!)

由此我们可以知道执行fork()函数会发生这样的事情:

fork
父进程
子进程

在这里插入图片描述

既然有父进程以及子进程之分,那就该想如何才能区分父子进程呢?

fork()函数知识点:

不需要参数并返回一个整数值。下面是fork()返回的不同值。

负值:创建子进程失败。

零:  返回到新创建的子进程。

正值:返回父母或来电者。该值包含新创建的子进程的进程ID。

因此我们可以这样做:

pid=fork();
if(pid == 0)
{
	//执行代码
}
if(pid > 0)
{
	//执行代码
}

此时,我们的主角 exec函数就登场了:在执行代码部分就可以调用该函数。


实例:

  1 #include<unistd.h>
  2 #include<stdio.h>
  3 #include<sys/types.h>
  4 #include<sys/stat.h>
  5 #include<stdlib.h>
  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

猜你喜欢

转载自blog.csdn.net/HG0724/article/details/102755679