📄 11.htm
字号:
无法判断欲执行文件的执行文件格式,有可能是格式错误或无法在此平台执行。<BR>EFAULT
参数filename所指的字符串地址超出可存取空间范围。<BR>ENAMETOOLONG 参数filename所指的字符串太长。<BR>ENOENT
参数filename字符串所指定的文件不存在。<BR>ENOMEM 核心内存不足<BR>ENOTDIR
参数filename字符串所包含的目录路径并非有效目录<BR>EACCES
参数filename字符串所包含的目录路径无法存取,权限不足<BR>ELOOP 过多的符号连接<BR>ETXTBUSY
欲执行的文件已被其他进程打开而且正把数据写入该文件中<BR>EIO I/O 存取错误<BR>ENFILE
已达到系统所允许的打开文件总数。<BR>EMFILE 已达到系统所允许单一进程所能打开的文件总数。<BR>EINVAL
欲执行文件的ELF执行格式不只一个PT_INTERP节区<BR>EISDIR ELF翻译器为一目录<BR>ELIBBAD
ELF翻译器有问题。<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>char *
argv[ ]={“ls”,”-al”,”/etc/passwd”,(char *)0};<BR>char * envp[
]={“PATH=/bin”,0}<BR>execve(“/bin/ls”,argv,envp);<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=linuxc181></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>execvp(执行文件) </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,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>#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 execvp(const char *file ,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>execvp()会从PATH 环境变量所指的目录中查找符合参数file
的文件名,找到后便执行该文件,然后将第二个参数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>如果执行成功则函数不会返回,执行失败则直接返回-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>/*请与execlp()范例对照*/<BR>#include<unistd.h><BR>main()<BR>{<BR>char
* argv[ ] ={
“ls”,”-al”,”/etc/passwd”,0};<BR>execvp(“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=linuxc182></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>exit(正常结束进程) </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,atexit,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>void exit(int status);<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>exit()用来正常终结目前进程的执行,并把参数status返回给父进程,而进程所有的缓冲区数据会自动写回并关闭未关闭的文件。<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><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>参考wait()<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋体 size=2><A
name=linuxc183></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>exit(结束进程执行) </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,wait,abort<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>void _exit(int status);<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>_exit()用来立刻结束目前进程的执行,并把参数status返回给父进程,并关闭未关闭的文件。此函数调用后不会返回,并且会传递SIGCHLD信号给父进程,父进程可以由wait函数取得子进程结束状态。<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><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>_exit()不会处理标准I/O
缓冲区,如要更新缓冲区请使用exit()。<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋体 size=2><A
name=linuxc184></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>vfork(建立一个新的进程) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>wait,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>#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>pid_t vfork(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>vfork()会产生一个新的子进程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量、已打开的文件代码、工作目录和资源限制等。Linux
使用copy-on-write(COW)技术,只有当其中一进程试图修改欲复制的空间时才会做真正的复制动作,由于这些继承的信息是复制而来,并非指相同的内存空间,因此子进程对这些变量的修改和父进程并不会同步。此外,子进程不会继承父进程的文件锁定和未处理的信号。注意,Linux不保证子进程会比父进程先执行或晚执行,因此编写程序时要留意<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><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>如果vfork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果vfork
失败则直接返回-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>EAGAIN 内存不足。ENOMEM
内存不足,无法配置核心所需的数据结构空间。<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>if(vfork() =
=0)<BR>{<BR>printf(“This is the child
process\n”);<BR>}else{<BR>printf(“This is the parent
process\n”);<BR>}<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>this is the parent process<BR>this is the child
process<BR></FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><BR><FONT face=宋体 size=2><A
name=linuxc185></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>getpgid(取得进程组识别码) </FONT></TD></TR>
<TR>
<TD vAlign=top width=80>
<DIV align=right><FONT face=宋体 size=2>相关函数 </FONT></DIV></TD>
<TD><FONT face=宋体 size=2>setpgid,setpgrp,getpgrp<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>pid_t getpgid( pid_t pid);<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>getpgid()用来取得参数pid
指定进程所属的组识别码。如果参数pid为0,则会取得目前进程的组识别码。<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>ESRCH 找不到符合参数pid 指定的进程。<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>/*取得init
进程(pid=1)的组识别码*/<BR>#include<unistd.h><BR>mian()<BR>{<BR>printf(“init
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -