📄 11.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- saved from url=(0056)http://linux.tcpip.com.cn/~foolox/c_fun/function/11.html --><HTML><HEAD><TITLE>Untitled Document</TITLE><META http-equiv=Content-Type content="text/html; charset=gb2312"><META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD><BODY><TABLE width="100%"> <TBODY> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc176></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD> <TD><FONT face=宋体 size=2><BR>atexit(设置程序正常结束前调用的函数) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>_exit,exit,on_exit<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>#include<stdlib.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>int atexit (void (*function)(void));<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>atexit()用来设置一个程序正常结束前调用的函数。当程序通过调用exit()或从main中返回时,参数function所指定的函数会先被调用,然后才真正由exit()结束程序。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>如果执行成功则返回0,否则返回-1,失败原因存于errno中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>#include<stdlib.h><BR>void my_exit(void)<BR>{<BR>printf(“before exit () !\n”);<BR>}<BR>main()<BR>{<BR>atexit (my_exit);<BR>exit(0);<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>before exit()!<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc177></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD> <TD><FONT face=宋体 size=2><BR>execl(执行文件) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>fork,execle,execlp,execv,execve,execvp<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>#include<unistd.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>int execl(const char * path,const char * arg,....);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>#include<unistd.h><BR>main()<BR>{<BR>execl(“/bin/ls”,”ls”,”-al”,”/etc/passwd”,(char * )0);<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>/*执行/bin/ls -al /etc/passwd */<BR>-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc178></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD> <TD><FONT face=宋体 size=2><BR>execlp(从PATH 环境变量中查找文件并执行) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>fork,execl,execle,execv,execve,execvp<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>#include<unistd.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>int execlp(const char * file,const char * arg,……);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>execlp()会从PATH 环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>错误代码 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>参考execve()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>/* 执行ls -al /etc/passwd execlp()会依PATH 变量中的/bin找到/bin/ls */<BR>#include<unistd.h><BR>main()<BR>{<BR>execlp(“ls”,”ls”,”-al”,”/etc/passwd”,(char *)0);<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc179></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD> <TD><FONT face=宋体 size=2><BR>execv(执行文件) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>fork,execl,execle,execlp,execve,execvp<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>#include<unistd.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>int execv (const char * path, char * const argv[ ]);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>execv()用来执行参数path字符串所代表的文件路径,与execl()不同的地方在于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>错误代码 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>请参考execve()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>范例 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>/* 执行/bin/ls -al /etc/passwd */<BR>#include<unistd.h><BR>main()<BR>{<BR>char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) }};<BR>execv(“/bin/ls”,argv);<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>执行 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>-rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋体 size=2><A name=linuxc180></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2><BR></FONT></DIV></TD> <TD><FONT face=宋体 size=2><BR>execve(执行文件) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>fork,execl,execle,execlp,execv,execvp<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>表头文件 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>#include<unistd.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>定义函数 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>int execve(const char * filename,char * const argv[ ],char * const envp[ ]);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>函数说明 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>返回值 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋体 size=2>错误代码 </FONT></DIV></TD> <TD><FONT face=宋体 size=2>EACCES<BR>1. 欲执行的文件不具有用户可执行的权限。<BR>2. 欲执行的文件所属的文件系统是以noexec 方式挂上。<BR>3.欲执行的文件或script翻译器非一般文件。<BR>EPERM<BR>1.进程处于被追踪模式,执行者并不具有root权限,欲执行的文件具有SUID 或SGID 位。<BR>2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID 或SGID 位元,但执行者并不具有root权限。<BR>E2BIG 参数数组过大<BR>ENOEXEC 无法判断欲执行文件的执行文件格式,有可能是格式错误或无法在此平台执行。<BR>EFAULT 参数filename所指的字符串地址超出可存取空间范围。<BR>ENAMETOOLONG 参数filename所指的字符串太长。<BR>ENOENT 参数filename字符串所指定的文件不存在。<BR>ENOMEM 核心内存不足<BR>ENOTDIR 参数filename字符串所包含的目录路径并非有效目录<BR>EACCES
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -