我编译并安装了一个新版本的内核,现在我必须让新内核支持两个新的原语,我在下面解释更多
我有一个文件,mysystemcalls test.c,我在其中获取流程,并在中为迭代进行分叉。这是我的测试文件。
//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: %ldn", 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: %ldn", getnchildren(1));
for(i=0; i<NCHILDREN; i++)
printf("pids[%d]:%dtgetcpid(%d,1):%ldn" ,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,在其子进程列表中的位置顺序。
- 使用
getpid
获取您自己的pid - 遍历
/proc
中以数字开头的所有目录 - 对于每个这样的目录,打开
status
文件 - 读取所有行,直到找到
PPid
行 - 如果
PPid
与getpid
中的值匹配,请将此目录名添加到数组中
这将为您获取其父进程为该进程的每个进程的ID。
这概述了一种简单的方法来执行PID涉及的一些常见函数。如果我是你,我会避免在C做这件事。麻烦比它的价值还大
#!/bin/bash
# getting children generally resolves nicely at some point
get_child() {
echo $(pgrep -laP $1 | awk '{print $1}')
}
# recursively getting parents isn't that useful,
# so single use function
get_parent() {
echo $(ps -o ppid= -p 36700)
}
get_children() {
__RET=$(get_child $1)
__CHILDREN=
while [ -n "$__RET" ]; do
__CHILDREN+="$__RET "
__RET=$(get_child $__RET)
done
__CHILDREN=$(echo "${__CHILDREN}" | xargs | sort)
echo "${__CHILDREN}"
}
get_children $1
FILE *fp;
char path[1024];
char command[1024];
sprintf(command, "/bin/bash /get_pids.sh %d", getpid());
fp = popen(command, "r");
while (fgets(path, sizeof(path), fp) != NULL) {
// children are listed here
printf("%s", path);
}
pclose(fp);
我一直试图为大卫·施瓦茨的方法编造一个邪恶的一句话,但我认为这是一个完全被诅咒的解决方案。其他一些抨击者可以尝试一下。