快速业务通道

LINUX进程控制(1)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-25
16336 Feb 13 2003 /usr/bin/passwd

  说明任何一个用户运行该程序时,该程序的有效身份都将是root,这样passwd程序才有权限读取/etc/passwd文件的信息.

  2. 进程的创建

  Linux下有四类创建子进程的函数:

  system(),fork(),exec*(),popen()

  2.1. system函数

  原型:

  #include <stdlib.h>

  int system(const char *string);

  system函数通过调用shell程序/bin/sh -c来执行string所指定的命令,该函数在内部是通过调用execve(“/bin/sh”,..)函数来实现的.通过system创建子进程后,原进程和子进程各自运行,相互间关联较少.如果system调用成功,将返回0. 拥有帝国一切,皆有可能。欢迎访问phome.net

  示例:

  #include <stdio.h>

  #include <stdlib.h>

  int main()

  {

  system("ls -l");

  return 0;

  }

  示例:

  #include <stdio.h>

  #include <stdlib.h>

  int main()

  {

  system("ls -l");

  return 0;

  }

  2.2. fork函数

  原型:

  #include <unistd.h>

  pid_t fork(void);

  fork函数创建子进程的过程为:在进程调用fork时,系统根据现有的进程的特性几乎是完全意义的复制出一个新的子进程,复制的内容包括原进程的当时内存空间的代码、变量、对象等所有内存状态,真实和有效uid和gid,环境、资源限制、打开的文件等.通过这种复制方式创建出子进程后,原有进程和子进程都从函数fork返回,各自继续往下运行,但是原进程的fork返回值于子进程的fork返回值不同,在原进程中,fork返回子进程的pid,而在进程中,fork返回0,如果fork返回负值,表示创建子进程失败.

  示例:

  // TestFork.cpp {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{

  #include <stdlib.h>

  #include <unistd.h>

  int main()

  {

  printf("Parent process id:%d\n",getpid());

  pid_t iRet=fork();

  if(iRet<0){

  printf("Create child process fail!\n");

  }else if(iRet==0){

  printf("I''m child process,and id:%d ppid:%d\n",

  getpid(),getppid());

  }else{

  printf("Create child process success,child id:%d\n",iRet);

  }

  return 0;

  }

  // TestFork.cpp }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

  shell>g TestFork..cpp

  shell>a.out

  Parent process id:6059

  I''m child process,and id:6060 ppid:6059

  Create child process success,child id:6060

  2.3. exec函数族

  exec*由一组函数组成,原型:

  #include <unistd.h>

  extern char **environ;

拥有帝国一切,皆有可能。欢迎访问phome.net

  int execl(const char *path, const char *arg, ...);

  int execlp(const char *file, const char *arg, ...);

  int execle(const char *path, const char *arg , ..., char * const envp[]);

  int execv(const char *path, char *const argv[]);

  int execvp(const char *file, char *const argv[]);

  exec函数族的工作过程与fork完全不同,fork是在复制一份原进程,而exec函数是用exec的第一个参数指定的程序在现有进程空间中运行,并且用新进程完全覆盖掉现有进程空间.

  path是可包括执行文件名的全路径名,而不是可执行文件所在的路径

  file既可以是全路径名,也可以是可执行文件名

  arg是可执行文件的命令行参数,可以有许多个,但通常的的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号