ubuntu 如何通过系统调用获取子PID?

g2ieeal7  于 2022-11-02  发布在  其他
关注(0)|答案(2)|浏览(305)

我编译并安装了一个新版本的内核,现在我必须使新内核支持两个新的原语,我将在下面详细解释
我有一个文件,mysystemcalls-test.c,在这里我得到了一个进程,并在一个for迭代中进行了分叉。这是我的测试文件。

//mysyscalls-test.c

# include <stdio.h>

# include <stdlib.h>

# include <unistd.h>

# include <sys/types.h>

# include <mysyscalls.h>

# define NCHILDREN 10

int main()
{

  int pids[NCHILDREN], i;
  int original_parent = getpid();

  printf ("before fork: current number of children: %ld\n", getnchildren(1));

  for (i=0; i<NCHILDREN; i++) {
    pids[i] = fork();

    if (pids[i] == 0) {
    while (getppid() == original_parent);
      exit(0);
    }
  }
printf("after fork: current number of children: %ld\n", getnchildren(1));

for(i=0; i<NCHILDREN; i++)
  printf("pids[%d]:%d\tgetcpid(%d,1):%ld\n" ,i,pids[i],i,getcpid(i,1));

return 0;
}

真实的的问题在第二个文件mysyscalls.h中,我无法对子进程进行正确的调用。

//mysyscalls.h

long getnchildren (int debug){
  int children;
  children = pids[i];
  return children;
}

long getcpid (int order, int debug){
  int childrenid;
  childrenid = getpid();
  return childrenid;
}

我不知道如何在mysyscalls.h文件中调用这些pid。我搜索并测试了一些代码,在这里找到了这些代码,但我没有准确的答案。我编写了这些代码,但没有工作,它返回相同的pid。
假设long getnchildren返回调用进程在调用原语时拥有的子进程数。

long getcpid返回调用进程的子进程的pid,位于其子进程列表中的order位置。

xfyts7mz

xfyts7mz1#

1.使用getpid获取您自己的pid。
1.循环访问/proc中以数字开头的所有目录。
1.对于每个这样的目录,打开status文件。
1.读取所有行,直到找到PPid行。
1.如果PPidgetpid中的值匹配,则将此目录名添加到数组中。
这将获取父进程是该进程的每个进程的ID。

7y4bm7vi

7y4bm7vi2#

这概述了一个简单的方法来做一些常见的功能涉及的PIDs。如果我是你,我会规避试图这样做在C。更多的麻烦比它的价值,海事组织。
第一个
我一直在为大卫·施瓦茨的方法编造一句邪恶的俏皮话,但我认为这是一个完全被诅咒的解决方案,其他一些害羞者可以尝试一下。

相关问题