当前位置:  技术问答>linux和unix

已知命令行,在程序中怎样获取其pid? 为保饭碗,急得要跳楼啊!哥们姐们救命呀!

    来源: 互联网  发布时间:2015-05-31

    本文导语:  各位大虾:     我对linux不熟悉,请教两个问题: 1、已知启动进程的命令行,如何在程序中得到其pid? 该命令带参数,例如:在一台服务 器上可以同时运行   OtsServer -DB pdb01、OtsServer -DB pdb02、OtsServer -DB pdb03...

各位大虾:
    我对linux不熟悉,请教两个问题:
1、已知启动进程的命令行,如何在程序中得到其pid? 该命令带参数,例如:在一台服务 器上可以同时运行   OtsServer -DB pdb01、OtsServer -DB pdb02、OtsServer -DB pdb03等,甚至OtsServer -DB pdb01还可以运行多次。
2、如果在进程运行后不好得到其pid,能否在启动时获得其pid?  我现在是用system(command),有没有别的命令可以在启动进程时返回其pid?
    新手上路,请说详细点。
    小妹在此先谢了!

|
摘自Unix编程常见问题解答
=========================================================================
Andrew (译者注:Andrew为原英文版编辑者Andrew Gierth,中文版由Edward Jiang
 发起并组织翻译和编辑) 
=====================================
fork函数干什么?
----------------------

     #include 
     #include 

     pid_t fork(void);

‘fork()’函数用于从已存在进程中创建一个新进程。新进程称为子进程,而原进程称为
父进程。你可以通过检查‘fork()’函数的返回值知道哪个是父进程,哪个是子进程。父
进程得到的返回值是子进程的进程号,而子进程则返回0。以下这个范例程序说明它的基本
功能:

     pid_t pid;

     switch (pid = fork())
     {
     case -1:
         /* 这里pid为-1,fork函数失败 */
         /* 一些可能的原因是 */
         /* 进程数或虚拟内存用尽 */
         perror("The fork failed!");
         break;

     case 0:
         /* pid为0,子进程 */
         /* 这里,我们是孩子,要做什么? */
         /* ... */
         /* 但是做完后, 我们需要做类似下面: */
         _exit(0);

     default:
         /* pid大于0,为父进程得到的子进程号 */
         printf("Child's pid is %dn",pid);
     }

当然,有人可以用‘if() ... else ...’语句取代‘switch()’语句,但是上面的形式是
一个有用的惯用方法。

知道子进程自父进程继承什么或未继承什么将有助于我们。下面这个名单会因为
不同Unix的实现而发生变化,所以或许准确性有了水份。请注意子进程得到的是
这些东西的 *拷贝*,不是它们本身。

由子进程自父进程继承到:

   * 进程的资格(真实(real)/有效(effective)/已保存(saved) 用户号(UIDs)和组号(GIDs))

   * 环境(environment)

   * 堆栈

   * 内存

   * 打开文件的描述符(注意对应的文件的位置由父子进程共享,这会引起含糊情况)

   * 执行时关闭(close-on-exec) 标志 (译者注:close-on-exec标志可通过fnctl()对文件描
     述符设置,POSIX.1要求所有目录流都必须在exec函数调用时关闭。更详细说明,
     参见 W. R. Stevens, 1993, 尤晋元等译(以下简称), 3.13节和8.9节)

   * 信号(signal)控制设定

   * nice值 (译者注:nice值由nice函数设定,该值表示进程的优先级,数值越小,优
     先级越高)

   * 进程调度类别(scheduler class) (译者注:进程调度类别指进程在系统中被调度时所
     属的类别,不同类别有不同优先级,根据进程调度类别和nice值,进程调度程序可计
     算出每个进程的全局优先级(Global process prority),优先级高的进程优先执行)

   * 进程组号

   * 对话期ID(Session ID) (译者注:译文取自,指:进程所属的对话期
     (session)ID, 一个对话期包括一个或多个进程组, 更详细说明参见
     9.5节)

   * 当前工作目录

   * 根目录 (译者注:根目录不一定是“/”,它可由chroot函数改变)

   * 文件方式创建屏蔽字(file mode creation mask (umask)) (译者注:译文取自,指:创建新文件的缺省屏蔽字)

   * 资源限制

   * 控制终端

子进程所独有:

   * 进程号

   * 不同的父进程号(译者注:即子进程的父进程号与父进程的父进程号不同,父进
     程号可由getppid函数得到)

   * 自己的文件描述符和目录流的拷贝(译者注:目录流由opendir函数创建,因其为
     顺序读取,顾称“目录流”)

   * 子进程不继承父进程的进程,正文(text),数据和其它锁定内存(memory locks)
     (译者注:锁定内存指被锁定的虚拟内存页,锁定后,不允许内核将其在必要时
     换出(page out),详细说明参见 2.2版,
     1999, 3.4.2节)

   * 在tms结构中的系统时间(译者注:tms结构可由times函数获得,它保存四个数据
     用于记录进程使用中央处理器(CPU:Central Processing Unit)的时间,包括:用户时
     间,系统时间,用户各子进程合计时间,系统各子进程合计时间)

   * 资源使用(resource utilizations)设定为0

   * 阻塞信号集初始化为空集(译者注:原文此处不明确,译文根据fork函数手册页
     稍做修改)

   * 不继承由timer_create函数创建的计时器

   * 不继承异步输入和输出

|
fork()
然后exce()

|
问题二:可以使用fork()获取pid,然后如果你需要的话可以把pid保存成文件供其它程序调用。

|
建议每个进程在运行后就把自己的pid存放起来,包括他fork出来的子进程,这样可以方便查找。
system调用在服务器中使用不是很合适的,自己用fork和exec类调用比较好,具体在《UNIX环境高级编程》中有介绍

|
getpid()
or
getppid()

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如何在一个已知的UNIX帐号下破解系统另一个已知帐号的密码??
  • linux下如何编程实现远程开机,已知mac地址
  • 已知一个进程的PID,如何得到其他信息?
  • 请问:如何根据已知数据画直线、矩形等图像,并以图像文件输出!
  • 请问已知进程的PID,通过什么函数可以得到进程的名字?
  • Solaris系统下如何获得进程名(已知进程ID)?
  • 菜菜的问一声,如何找到一个目录,目录名已知
  • 已知硬盘分区表项,如何计算该分区的第一个扇区在那?
  • 请问有没有办法方便提取某个已知进程所占用的socket号?谢谢
  • 已知一段文本,在unix怎样查找包含该文本的文件
  • 已知pid文件,实现杀死该进程的shell脚本怎么写?
  • 已知进程名,检测进程是否在运行并调用
  • 『硬盘』求获得硬盘格式和信息的办法,和已知CHS如何进行寻址,求教!
  • 在C SHELL中,如何判断在某一指定目录下是否有已知文件名存在?
  • 有没有可以从已知图片里过滤出,不规则图片的滤镜??
  • 求jsp向对方已知IP传GET方法及参数,并分析返回字符串的例子?
  • File类的getLastModify()得到的是长型整数,如何才能得到一个已知文件日期?
  • 已知一个进程的PID,但不知道这个进程是否停止,如何能知道系统中是否有相应的进程在运行。
  • 已知a=1,b=2 String string="a+b";如何将string转化为表达式,并计算结果
  • 笨问题----已知今天日期,怎样得到明天日期?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3