exec 函数
Linux系统进程控制编程(三)——exec函数族的使用
作者:zieckey ()
All Rights Reserved!
exec用被执行的程序完全替换调用它的程序的影像。fork创建一个新的进程就产生了一个新的PID,
exec启动一个新程序,替换原有的进程,因此这个新的被exec执行的进程的PID不会改变,
和调用exec函数的进程一样。
int exec…装入和运行其它程序:
int execl( char *pathname,char *arg0,char *arg1,...,char *argn,NULL)
int execle( char *pathname,char *arg0,char *arg1,...,char *argn,NULL,char *envp[])
int execlp( char *pathname,char *arg0,char *arg1,...,NULL)
int execlpe(char *pathname,char *arg0,char *arg1,...,NULL,char *envp[])
int execv( char *pathname,char *argv[])
int execve( char *pathname,char *argv[],char *envp[])
int execvp( char *pathname,char *argv[])
int execvpe(char *pathname,char *argv[],char *envp[])
exec函数族装入并运行程序pathname,并将参数
arg0(arg1,arg2,argv[],envp[])传递给子程序,出错返回-1
在exec函数族中,后缀l、v、p、e添加到exec后,
所指定的函数将具有某种操作能力
有后缀 p时,函数可以利用DOS的PATH变量查找子程序文件。
假如你希望执行命令 /bin/cat /etc/passwd /etc/group,
l时,希望接收以逗号分隔的参数列表,列表以NULL指针作为结束标志
execl( "/bin/cat","/etc/passed","/etc/group",NULL);
v时,希望接收到一个以NULL结尾的字符串数组的指针
char* argv[] = {"/bin/cat","/etc/passed","/etc/group",NULL}
execv( "/bin/cat", argv );
e时,函数传递指定参数envp,允许改变子进程的环境,无后缀e时,子进程使用当前程序的环境。
envp也是一个以NULL结尾的字符串数组指针
execl(执行文件)
相关函数
fork,execle,execlp,execv,execve,execvp
表头文件
#include
定义函数
int execl(const char * path,const char * arg,....);
函数说明
execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。
范例
#include
main()
{
execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);
}
执行
/*执行/bin/ls -al /etc/passwd */
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
execlp(从PATH 环境变量中查找文件并执行)
相关函数
fork,execl,execle,execv,execve,execvp
表头文件
#include
定义函数
int execlp(const char * file,const char * arg,……);
函数说明
execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
错误代码
参考execve()。
范例
/* 执行ls -al /etc/passwd execlp()会依PATH 变量中的/bin找到/bin/ls */
#include
main()
{
execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);
}
执行
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
execv(执行文件) 相关函数
fork,execl,execle,execlp,execve,execvp
表头文件
#include
定义函数
int execv (const char * path, char * const argv[ ]);
函数说明
execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件。
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
错误代码
请参考execve()。
范例
/* 执行/bin/ls -al /etc/passwd */
#include
main()
{
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};
execv(“/bin/ls”,argv);
}
执行
-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd
execve(执行文件)
相关函数
fork,execl,execle,execlp,execv,execvp
表头文件
#include
定义函数
int execve(const char * filename,char * const argv[ ],char * const envp[ ]);
函数说明
execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,
argv要传递给程序的完整参数列表,包括argv[0],它一般是执行程序的名字;最后一个参数则为传递给执行文件的新环境变量数组。
返回值
如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。
错误代码
EACCES
1. 欲执行的文件不具有用户可执行的权限。 2. 欲执行的文件所属的文件系统是以noexec 方式挂上。
3.欲执行的文件或script翻译器非一般文件。
EPERM
1.进程处于被追踪模式,执行者并不具有root权限,欲执行的文件具有SUID 或SGID 位。
2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID 或SGID 位元,但执行者并不具有root权限
/****************************************************************************
**
** execve.c--Illustrate the usage of execve
**
*****************************************************************************/
#include
#include
#include
int main( void )
{
char* args[] = { "/bin/ls", NULL };
if ( -1 == (execve("/bin/ls", args, NULL)) )
{
perror( "execve" );
exit( EXIT_FAILURE);
}
puts( "shouldn't get here" );
exit( EXIT_SUCCESS );
}
[root@localhost src]# gcc execve.c
[root@localhost src]# ./a.out
a.out child_fork.c execve.c fork.c getpid.c
sqlserver exec命令用法 -回复
sqlserver exec命令用法 -回复
SQL Server中的EXEC命令用于执行存储过程、用户定义的函数、动态SQL语句和系统存储过程等。在本篇文章中,我们将逐步回答关于EXEC命令的用法。让我们开始吧!
第一步:执行存储过程
存储过程是一个预定义的SQL代码块,可以通过EXEC命令来执行。 EXEC命令的语法如下:
EXEC procedure_name;
其中,procedure_name是要执行的存储过程的名称。执行存储过程时,可以传递参数。
例如,我们有一个名为"GetEmployeeDetails"的存储过程,它接受一个参数@employee_id,返回给定员工ID的详细信息。我们可以使用以下EXEC命令来执行该存储过程:
EXEC GetEmployeeDetails @employee_id = 1001;
此命令将执行名为"GetEmployeeDetails"的存储过程,并将值1001传递给@employee_id参数。
第二步:执行用户定义的函数
除了存储过程,EXEC命令还可以用于执行用户定义的函数。用户定义的函数是一个独立的代码块,接受输入参数并返回一个值。 EXEC命令的语法如下:
EXEC @return_value = function_name parameter1, parameter2, ...;
其中,function_name是要执行的函数的名称,参数是函数的输入参数,@return_value是函数的返回值。
假设我们有一个名为"CalculateAverageGrade"的函数,它接受两个参数@subject和@grade,并返回指定科目的平均成绩。我们可以使用以下EXEC命令来执行该函数:
EXEC @avg_grade = CalculateAverageGrade @subject = 'Math',
@grade = 80;
此命令将执行名为"CalculateAverageGrade"的函数,将参数'Math'传递给@subject参数,将值80传递给@grade参数,并将返回的平均成绩存储在@avg_grade变量中。
fork函数超详解及其用法
3. 进程控制
上一页 第
30 章 进程 下一页
3. 进程控制
3.1. fork函数
#include
#include
pid_t fork(void);
fork调用失败则返回-1,调用成功的返回值见下面的解释。我们通过一个例子来理解fork是怎样创建新进程的。
例 30.3. fork
#include
#include
#include
#include
int main(void)
{
pid_t pid;
char *message;
int n;
pid = fork();
if (pid < 0) {
perror("fork failed"); exit(1);
}
if (pid == 0) {
message = "This is the child\n";
n = 6;
} else {
message = "This is the parent\n";
n = 3;
}
for(; n > 0; n--) {
printf(message);
sleep(1);
}
return 0;
}
$ ./a.out
This is the child
This is the parent
This is the child
This is the parent
This is the child
This is the parent
This is the child
$ This is the child
This is the child 这个程序的运行过程如下图所示。
图 30.4. fork
父进程初始化。
父进程调用fork,这是一个系统调用,因此进入内核。
rce常见函数的使用 -回复
rce常见函数的使用 -回复
RCE(远程代码执行)漏洞是Web应用程序中最严重的安全漏洞之一。攻击者通过利用RCE漏洞可以在受影响的服务器上执行任意代码,这可能导致服务器被完全控制,从而对系统和数据造成严重威胁。在本文中,我们将重点介绍五个常用的函数,这些函数经常被攻击者用于利用RCE漏洞。
1. eval函数
eval函数是RCE攻击中最常用的函数之一。eval函数可以将一个字符串作为脚本代码执行。这意味着攻击者可以通过将恶意代码作为参数传递给eval函数,从而在服务器端执行任意代码。eval函数的使用如下所示:
eval(_GET['code']);
在这个示例中,攻击者可以通过在URL中传递code参数来执行任意的PHP代码。由于eval函数的存在,攻击者可以完全控制服务器上的代码执行过程。
2. system函数
system函数是用于执行操作系统命令的函数。通过使用system函数,攻击者可以在服务器上执行任意的命令。下面是一个示例使用system函数执行命令的代码:
system(_GET['cmd']);
在这个示例中,攻击者可以通过在URL中传递cmd参数来执行任意的操作系统命令。攻击者可以使用这个函数来浏览服务器上的文件系统、上传恶意文件或者执行其他危险操作。
3. passthru函数
passthru函数也是用于执行操作系统命令的函数,但与system函数不同的是,它会将命令的输出直接发送到浏览器。下面是一个示例使用passthru函数执行命令的代码:
passthru(_GET['cmd']);
攻击者可以通过在URL中传递cmd参数来执行任意的操作系统命令,并在浏览器上直接查看命令的输出。这使得攻击者可以更轻松地获取服务器上的敏感信息。
4. exec函数
exec函数也是用于执行操作系统命令的函数。与system函数和passthru函数类似,攻击者可以使用exec函数来执行任意的操作系统命令。下面是一个示例使用exec函数执行命令的代码:
Oracle中执行存储过程call和exec区别
Oracle中执⾏存储过程call和exec区别
在sqlplus中这两种⽅法都可以使⽤:
exec pro_name(参数1..); call pro_name(参数1..);
区别: 1. 但是exec是sqlplus命令,只能在sqlplus中使⽤;call为SQL命令,没有限制.
2. 存储过程没有参数时,exec可以直接跟过程名(可以省略()),但call则必须带上().
Sql代码
SQL> --创建过程 插⼊数据
SQL> create or replace procedure pro1 is
2 begin --执⾏部分
3 insert into mytest values('张三', 'mm');
4 end;
5 /
Procedure created
SQL> exec pro1;
PL/SQL procedure successfully completed
SQL> call pro1;
call pro1
ORA-06576: 不是有效的函数或过程名
SQL> call pro1();
Method called
总结:在调⽤过程时,应该养成使⽤call,且要带上()的习惯。---------------------
exec是sqlplus的命令,只能在sqlplus中使⽤。
call是sql命令,任何⼯具都可以使⽤,call必须有括号,即例没有参数
call必须有括号,即例没有参数 idle> connect /as sysdba 已连接。 sys@PO10> sys@PO10> create procedure p_test is 2 begin 3 null; 4 end; 5 / 过程已创建。 sys@PO10> sys@PO10> exec p_test PL/SQL 过程已成功完成。 sys@PO10> call p_test 2 ; call p_test * 第 1 ⾏出现错误: ORA-06576: 不是有效的函数或过程名 sys@PO10> call p_test(); 调⽤完成。 sys@PO10> exec 只能在SQLPLUS中使⽤;call可以在任何地⽅使⽤
db.execsql函数用法
标题:深入了解db.execsql函数的用法
随着移动互联网的快速发展,移动应用程序开发已成为当前互联网行业的热门趋势。在移动应用程序开发过程中,数据库操作是一个非常重要的环节。而在Android评台上,使用SQLite数据库是非常普遍的选择。SQLite是一种轻量级的关系型数据库管理系统,被广泛应用于移动设备和嵌入式系统。
在Android开发中,我们通常会使用SQLiteOpenHelper类来管理数据库的创建和版本控制,使用SQLiteDatabase类来执行数据库操作。在SQLiteDatabase类中,提供了一个execSQL函数,用于执行SQL语句。本文将深入探讨db.execsql函数的用法,帮助读者更好地理解和应用这个函数。
一、execSQL函数的基本用法
1.1 execSQL函数的定义和作用
execSQL函数是SQLiteDatabase类中用于执行SQL语句的方法,其使用方法如下:
public void execSQL (String sql)
该函数接收一个字符串参数sql,用于执行所传入的SQL语句。通过该函数,可以执行非查询型的SQL语句,如建表、删表、增、删、改等操作。
1.2 execSQL函数的调用方式
在实际开发中,我们通常通过获取SQLiteDatabase对象来调用execSQL函数。获取SQLiteDatabase对象的方式有多种,一般可以通过SQLiteOpenHelper类的getWritableDatabase方法来获取可写的数据库对象,然后调用execSQL函数执行相应的SQL语句。
1.3 execSQL函数的返回值
execSQL函数是一个void类型的方法,即没有返回值。在执行SQL语句时,如果出现异常或错误,execSQL函数将会抛出SQLException异常。
二、execSQL函数的使用场景
2.1 创建和删除表
在SQLite数据库中,通过执行CREATE TABLE和DROP TABLE语句可以创建和删除数据库表。execSQL函数可以用来执行这些创建和删除表的操作。
sqlserver exec命令用法 -回复 2
sqlserver exec命令用法 -回复
什么是SQL Server EXEC命令?
在SQL Server中,EXEC是一条用于执行存储过程、函数、动态SQL语句或者批处理语句的命令。通过使用EXEC命令,可以向数据库发送一个SQL指令,以便执行特定的操作或返回一个结果集。
EXEC命令的语法如下:
EXEC sp_name [argument1 [, argument2, ...]]
在这里,sp_name是要执行的存储过程或函数的名称。如果需要传递参数给存储过程或函数,可以在EXEC命令中指定这些参数。
EXEC命令的用法:
1. 执行存储过程:
使用EXEC命令可以调用已经定义好的存储过程。例如,如果有一个名为"GetCustomers"的存储过程,用于从数据库中获取客户信息,可以使用以下命令来执行该存储过程:
EXEC GetCustomers
这将执行存储过程并返回结果集。
2. 执行动态SQL语句:
EXEC命令在执行动态SQL语句时非常有用。动态SQL语句是在运行时构建的SQL语句,通常使用字符串拼接构建。使用EXEC命令,可以将动态SQL语句作为一个字符串参数传递,并在EXEC命令中执行它。例如:
DECLARE @sqlCommand VARCHAR(100)
DECLARE @columnName VARCHAR(20)
SET @columnName = 'FirstName'
SET @sqlCommand = 'SELECT ' + @columnName + ' FROM
Customers'
EXEC (@sqlCommand)
在这个例子中,动态SQL语句构建了一个SELECT语句,并通过EXEC命令执行该语句。这样可以根据需要动态选择要返回的列名。
3. 批处理执行命令:
EXEC命令还可以用于执行批处理语句。批处理语句是多个SQL语句组成的一组命令,可以按顺序执行。通过将多个SQL语句放在同一个EXEC命令中,可以一次性执行这些语句。例如:
函数大全(e开头)
计算机科学与技术社区CSTC团队资料组制作
Copy Right by CSTC Technology 2003© All Rights Reserved
函数大全(e开头)
函数名: ecvt
功 能: 把一个浮点数转换为字符串
用 法: char ecvt(double value, int ndigit, int *decpt, int *sign);
程序例:
#include
#include
#include
int main(void)
{
char *string;
double value;
int dec, sign;
int ndig = 10;
clrscr();
value = 9.876;
string = ecvt(value, ndig, &dec, &sign);
printf("string = %s dec = %d \
sign = %d\n", string, dec, sign);
value = -123.45;
ndig= 15;
string = ecvt(value,ndig,&dec,&sign);
printf("string = %s dec = %d sign = %d\n",
string, dec, sign);
value = 0.6789e5; /* scientific
notation */
ndig = 5;
string = ecvt(value,ndig,&dec,&sign);
printf("string = %s dec = %d\
sign = %d\n", string, dec, sign);
return 0;
}
函数名: ellipse
功 能: 画一椭圆 计算机科学与技术社区CSTC团队资料组制作
Copy Right by CSTC Technology 2003© All Rights Reserved
js 正则函数
js 正则函数
js 正则函数
JavaScript中的正则函数是一组用于处理字符串的函数,它们使用正则表达式来匹配和操作字符串。以下是一些常用的正则函数:1. test()函数:用于检测一个字符串是否匹配某个正则表达式,返回一个布尔值。2. exec()函数:用于在一个字符串中查找匹配的正则表达式,返回一个数组,包含匹配的子串和捕获组。3. match()函数:用于在一个字符串中查找匹配的正则表达式,返回一个数组,包含匹配的子串和捕获组。4.
search()函数:用于在一个字符串中查找匹配的正则表达式,返回匹配的位置。5. replace()函数:用于在一个字符串中替换匹配的正则表达式,返回替换后的字符串。6. split()函数:用于将一个字符串分割成多个子串,返回一个数组。这些函数都可以使用正则表达式作为参数,以实现不同的字符串操作。
perl system函数
perl system函数
Perl system函数是Perl中的一种内置函数,它可以用来调用操作系统服务,执行外部程序,并返回其输出。它通常用于调用外部程序,或者在Perl程序中执行shell命令。该函数返回值为操作系统的返回代码,即0表示成功,非0表示失败。
Perl system函数的语法格式如下:
system(COMMAND); system(COMMAND, LIST);
system(COMMAND @LIST);
第一种形式是调用一个单独的命令,而第二种和第三种形式则是调用一个命令,同时传入一个参数列表,参数列表被转换为字符串形式传入到系统中。
使用system函数可以很方便地执行特定的操作系统命令,也可以把命令输出重定向到文件中,或者添加参数列表。
system函数可以使用不同的方式来执行操作系统命令,其中有三种最常用的方式:
1. 使用exec函数:
exec(COMMAND);
exec函数可以直接在Perl程序中执行操作系统命令,但是它不会返回任何信息,也不会创建子进程。 2. 使用backticks:
$output = `COMMAND`;
使用backticks可以在Perl程序中执行操作系统命令,它将命令的输出赋值给$output变量,可以通过$output变量获取命令的输出结果。
3. 使用system函数:
system(COMMAND);
system函数可以在Perl程序中调用操作系统服务,执行外部程序,并返回其输出,它可以把命令的输出重定向到文件中,或者添加参数列表。
这里有一个使用Perl system函数来显示当前目录下所有文件的简单示例:
#!/usr/bin/perl system("ls -al");
上面的示例中,使用system函数执行ls -al命令,该命令会列出当前目录下的所有文件。
总的来说,Perl system函数可以让我们很容易地在Perl程序中执行操作系统命令,它可以把命令的输出重定向到文件中,或者添加参数列表,使得Perl程序可以更好地集成到操作系统中。
sql exec 参数
sql exec 参数
SQL exec 参数是指在SQL语句中使用exec语句并传入参数来执行特定操作的一种方法。在本文中,我们将探讨SQL exec 参数的用法和相关注意事项。
让我们了解一下SQL exec语句的基本用法。在SQL中,exec语句用于执行存储过程或用户定义的函数。它可以接受零个或多个参数,并将这些参数传递给被执行的存储过程或函数。通过使用exec语句,我们可以在SQL中实现更复杂的逻辑和操作。
在使用exec语句时,我们需要注意以下几点。首先,要确保传递给exec语句的参数类型和数量与被执行的存储过程或函数定义中的参数类型和数量相匹配。如果参数类型或数量不匹配,可能会导致执行失败或产生错误的结果。
我们需要注意参数的顺序。在执行exec语句时,参数的顺序必须与存储过程或函数定义中参数的顺序一致。如果参数的顺序不正确,可能会导致执行失败或得到错误的结果。
我们还需要注意参数的值。在传递参数给exec语句时,要确保参数的值是有效的,并且符合被执行的存储过程或函数的要求。如果参数的值无效或不符合要求,可能会导致执行失败或得到错误的结果。
我们还可以在exec语句中使用输出参数。输出参数是指在执行存储过程或函数后,将结果返回给调用者的参数。通过使用输出参数,我们可以方便地获取存储过程或函数的执行结果,并进行后续的操作和处理。
在使用exec语句时,我们可以使用各种SQL语句和操作。例如,我们可以使用exec语句执行查询操作,获取数据库中的数据。我们还可以使用exec语句执行更新操作,修改数据库中的数据。此外,我们还可以使用exec语句执行插入操作,向数据库中插入新的数据。
需要注意的是,在使用exec语句时,我们需要确保参数的值是安全的,以避免SQL注入等安全问题。为了确保参数的安全性,我们可以使用参数化查询或预编译语句来处理参数。这样可以将参数的值与SQL语句分离,从而有效地防止恶意输入对数据库的攻击。
