linux操作系统基本操作详细讲解(5)

2019-04-21 18:41

于execve()只需两个参数,第二个参数利用数组指针来传递给执行文件。

返回值 如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

范例 /* 执行/bin/ls -al /etc/passwd */ #include main() {

char * argv[ ]={―ls‖,‖-al‖,‖/etc/passwd‖,(char*) 0}}; execv(―/bin/ls‖,argv); }

2.3.4 execve(执行文件)

定义函数 int execve(const char * filename,char * const argv[ ],char * const envp[ ]); 函数说明 execve()用来执行参数filename字符串所代表的文件路径,第二个参数系利用数组指针来传递给执行文件,最后一个参数则为传递给执行文件的新环境变量数组。 返回值 如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno 中。

错误代码 EACCES

1. 欲执行的文件不具有用户可执行的权限。

2. 欲执行的文件所属的文件系统是以noexec 方式挂上。 3.欲执行的文件或script翻译器非一般文件。 EPERM

1.进程处于被追踪模式,执行者并不具有root权限,欲执行的文件具有SUID 或SGID 位。

2.欲执行的文件所属的文件系统是以nosuid方式挂上,欲执行的文件具有SUID 或SGID 位元,但执行者并不具有root权限。 E2BIG 参数数组过大

ENOEXEC 无法判断欲执行文件的执行文件格式,有可能是格式错误或无法在此平台执行。

EFAULT 参数filename所指的字符串地址超出可存取空间范围。 ENAMETOOLONG 参数filename所指的字符串太长。

ENOENT 参数filename字符串所指定的文件不存在。 ENOMEM 核心内存不足

ENOTDIR 参数filename字符串所包含的目录路径并非有效目录 EACCES 参数filename字符串所包含的目录路径无法存取,权限不足 ELOOP 过多的符号连接

ETXTBUSY 欲执行的文件已被其他进程打开而且正把数据写入该文件中 EIO I/O 存取错误

ENFILE 已达到系统所允许的打开文件总数。

EMFILE 已达到系统所允许单一进程所能打开的文件总数。 EINVAL 欲执行文件的ELF执行格式不只一个PT_INTERP节区 EISDIR ELF翻译器为一目录 ELIBBAD ELF翻译器有问题。 范例 #include main() {

char * argv[ ]={―ls‖,‖-al‖,‖/etc/passwd‖,(char *)0}; char * envp[ ]={―PATH=/bin‖,0} execve(―/bin/ls‖,argv,envp); }

2.3.5 execvp(执行文件)

定义函数 int execvp(const char *file ,char * const argv []);

函数说明 execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。

返回值 如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。

范例 /*请与execlp()范例对照*/ #include main() {

char * argv[ ] ={ ―ls‖,‖-al‖,‖/etc/passwd‖,0};

execvp(―ls‖,argv); } 3. 进程等待

3.1 wait(等待子进程中断或结束)

表头文件 #include #include

定义函数 pid_t wait (int * status);

函数说明 wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程ID也会一快返回。如果不在意结束状态值,则参数 status可以设成NULL。子进程的结束状态值请参考waitpid()。

返回值 如果执行成功则返回子进程ID(PID),如果有错误发生则返回-1。失败原因存于errno中。 附加说明

范例 #include #include #include #include main() {

pid_t pid; int status,i; if(fork()= =0){

printf(―This is the child process .pid =%d\\n‖,getpid()); exit(5); }else{

sleep(1);

printf(―This is the parent process ,wait for child...\\n‖; pid=wait(&status); i=WEXITSTATUS(status);

printf(―child’s pid =%d .exit status=^d\\n‖,pid,i);

} }

3.2 waitpid(等待子进程中断或结束)

表头文件 #include #include

定义函数 pid_t waitpid(pid_t pid,int * status,int options);

函数说明 waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程ID也会一快返回。如果不在意结束状态值,则参数status可以设成NULL。参数pid为欲等待的子进程ID,其他数值意义如下: pid<-1 等待进程组ID为pid绝对值的任何子进程。 pid=-1 等待任何子进程,相当于wait()。

pid=0 等待进程组ID与目前进程相同的任何子进程。 pid>0 等待任何子进程ID为pid的子进程。 参数option可以为0 或下面的OR 组合:

WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。

WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。 子进程的结束状态返回后存于status,底下有几个宏可判别结束情况 WIFEXITED(status)如果子进程正常结束则为非0值。

WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才能使用此宏。

WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真

WTERMSIG(status)取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。

WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。

WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。

返回值 如果执行成功则返回子进程ID(PID),如果有错误发生则返回-1。失败原因存

于errno中。 4. 信号

4.1 kill(传送信号给指定的进程)

表头文件 #include #include

定义函数 int kill(pid_t pid,int sig);

函数说明 kill()可以用来送参数sig指定的信号给参数pid指定的进程。参数pid有几种情况:

pid>0 将信号传给进程ID为pid 的进程。

pid=0 将信号传给和目前进程相同进程组的所有进程 pid=-1 将信号广播传送给系统内所有的进程

pid<0 将信号传给进程组ID为pid绝对值的所有进程 返回值 执行成功则返回0,如果有错误则返回-1。 错误代码 EINVAL 参数sig 不合法

ESRCH 参数pid 所指定的进程或进程组不存在 EPERM 权限不够无法传送信号给指定进程

范例 #include #include #include #include main() {

pid_t pid; int status; if(!(pid= fork())){

printf(―Hi I am child process!\\n‖); sleep(10); return; } else{


linux操作系统基本操作详细讲解(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:护理伦理学复习题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: