首页 > 编程知识 正文

php exec函数,c语言程序函数

时间:2023-05-05 22:44:14 阅读:114739 作者:2298

文章目录execvpexecvexeclp和execlexecvpe和execle参考文档

(是将参考文件翻译整理而成的,对原文有补充)

exec函数系列用新进程替换当前正在运行的进程。 可以使用头文件unistd.h下的另一个c程序运行c程序。 exec系列有很多成员。 以下为示例。

execvp execvp :使用此命令时,创建的子进程不需要运行与父进程相同的程序。 exec类型的系统调用允许进程执行任何程序文件,包括二进制可执行文件和shell脚本。 语法:

int execvp (常数char * file,char *常数argv [ ]; file :显示执行文件的文件名

argv :是以null结尾的字符指针数组。 argv参数描述指向一个或多个以null结尾的字符串的指针列表。这些字符串作为参数列表传递给file文件进行执行

例1

让我们看一个小例子(c中的execvp ) )演示如何使用函数。 有两个. c文件,EXEC.c和execDemo.c,通过调用execDemo.c的execvp ()函数,将execDemo.c的运行替换为EXEC.c的运行。

//exec.c# include stdio.h # include unistd.hint main ({ inti; printf(Iamexec.ccalledbyexecvp ) ); printf((n ); 返回0; }使用命令创建EXEC.c可执行文件

GC exec.c-oexec//exec demo.c # include stdio.h # include stdlib.h # include unistd.hint main ()/anulltermination )/* allstatementsareignoredafterexecvp (callasthiswholeprocess ) execdemo.c ) isreplacedbyanotherprocess (exec.c )/rether }使用命令创建execDemo.c可执行文件:

使用gcc execDemo.c -o execDemo命令./excDemo运行execDemo.c可执行文件时,将获得以下输出:

I AM EXEC.c called by execvp ()在编译文件execDemo.c时,如果执行execvp(args )、args语句,将被程序EXEC.c替换。 之所以不打印" Ending-- ",是因为调用execvp (函数时,它将被程序EXEC.c替换。

例2

execvp执行shell的示例。 d.sh的内容如下。

#! /ssdcg/bashdate test.c与d.sh位于同一目录中,内容如下:

# include stdio.hint main ((char * arglist ) )=() sh )、() d.sh )、NULL} ); printf(Begin(n ); execvp(sh )、arglist; 打印机(end (n ) ); }编译并运行。 execvp在运行d.sh时退出,因此不会打印“结束”。

# gcc test.c-o test #./testbeginmonfeb 1522336030336017 CST 2021 execv execv :语法上与execvp ()函数非常类似。

语法:

int execv (常数char * path,char *常数argv [ ]; path :正在运行的文件的路径

argv [ ] :以null结尾的字符指针数组

例3

请看一个小例子,来说明在c中使用execv )函数的方法吧。 此示例类似于上面显示的execvp (的示例。

//exec.c# include stdio.h # include unistd.hint main ({ inti; printf(Iamexec.ccal

led by execv() "); printf("n"); return 0; }

    使用命令创建EXEC.c的可执行文件:

gcc EXEC.c -o EXEC //execDemo.c #include<stdio.h> #include<stdlib.h> #include<unistd.h> int main() { //A null terminated array of character //pointers char *args[]={"./EXEC",NULL}; execv(args[0],args); /*All statements are ignored after execvp() call as this whole process(execDemo.c) is replaced by another process (EXEC.c) */ printf("Ending-----"); return 0; }

    使用命令创建execDemo.c的可执行文件

gcc execDemo.c -o execDemo

    使用命令./excDemo运行execDemo.c的可执行文件后,我们得到以下输出:

I AM EXEC.c called by execv()

    execvp和execv的区别,是第一个参数的不同,一个是file,一个是path,如果将示例2修改为execv的程序,test.c代码如下:
示例4

#include <stdio.h>int main(){ char *arglist[]={"sh","d.sh",NULL}; printf("beginn"); execv("/ssdcg/bash",arglist); printf("endn");} execlp和execl

    execlp 和 execl:这两个也有相同的用途,但是它们的语法略有不同。

int execlp(const char *file, const char *arg,.../* (char *) NULL */);int execl(const char *path, const char *arg,.../* (char *) NULL */);

    file:正在执行的文件的文件名
    const char *arg和省略号:描述一个或多个指向以null终止的字符串的指针的列表,这些字符串表示可用于执行的程序的参数列表。
    上面的相似的C程序可以用 execlp() 或 execl() 函数执行,它们将执行相同的任务,即用新进程替换当前进程。
示例5
    将示例2中的test.c改成execl的程序为:

#include <stdio.h>int main(){ char *arglist[]={"sh","d.sh",NULL}; printf("beginn"); execl("/ssdcg/bash",arglist[0], arglist[1], arglist[2]); printf("endn");} execvpe和execle

    execvpe 和 execle:这两个函数也有相同的用途,但是它们的语法与上面提到的exec家族的所有成员都有点不同。

int execvpe(const char *file, char *const argv[],char *const envp[]);int execle(const char *path, const char *arg, .../*, (char *) NULL, char * const envp[] */);

    上面显示的语法与所有上面的exec成员都有一个不同的参数:
    char * const envp[]:允许调用者通过参数envp指定执行程序的环境。
    envp:此参数指向以null结尾的字符串的指针数组,必须由null指针结尾。其他函数从调用进程中的外部变量environ获取新进程映像的环境。

参考文档

[1]MAZHAR IMAM KHAN.exec family of functions in C[EB/OL].https://www.geeksforgeeks.org/exec-family-of-functions-in-c/,2019-05-24.

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。