当前位置: 技术问答>linux和unix
怎样看父进程是哪个?
来源: 互联网 发布时间:2016-08-07
本文导语: #include #include #include #include #include /* For constants ORIG_EAX etc */ int main() { pid_t child; long orig_eax; child = fork(); ...
#include
#include
#include
#include
#include /* For constants
ORIG_EAX etc */
int main()
{
pid_t child;
long orig_eax;
child = fork();
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
else {
wait(NULL);
orig_eax = ptrace(PTRACE_PEEKUSER,
child, 4 * ORIG_EAX,
NULL);
printf("The child made a "
"system call %ld ", orig_eax);
ptrace(PTRACE_CONT, child, NULL, NULL);
}
return 0;
}
请问一下这段代码的父进程是哪个进程???
#include
#include
#include
#include /* For constants
ORIG_EAX etc */
int main()
{
pid_t child;
long orig_eax;
child = fork();
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
else {
wait(NULL);
orig_eax = ptrace(PTRACE_PEEKUSER,
child, 4 * ORIG_EAX,
NULL);
printf("The child made a "
"system call %ld ", orig_eax);
ptrace(PTRACE_CONT, child, NULL, NULL);
}
return 0;
}
请问一下这段代码的父进程是哪个进程???
|
父子进程会在
child = fork()
之后一起往下执行。。
因为fork会复制当前进程的映像,所以父子进程执行的代码也完全一样
通过child值来判断当前是在父进程还是子进程。。如果是0。。则在子进程中,否则在父进程中。。
child = fork()
之后一起往下执行。。
因为fork会复制当前进程的映像,所以父子进程执行的代码也完全一样
通过child值来判断当前是在父进程还是子进程。。如果是0。。则在子进程中,否则在父进程中。。
|
printf("%dn", getppid());
|
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
这段代码是子进程的工作内容。下面的else是父进程的工作内容。
因为fork函数在子进程中返回值是0,父进程中的返回值是子进程的pid值,非零。
所以在子进程if判断中进入if中执行,在父进程中进入else中执行
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
这段代码是子进程的工作内容。下面的else是父进程的工作内容。
因为fork函数在子进程中返回值是0,父进程中的返回值是子进程的pid值,非零。
所以在子进程if判断中进入if中执行,在父进程中进入else中执行
|
if(child == 0) {
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
子进程执行结束后,应该退出吧,exit(0);
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
execl("/bin/ls", "ls", NULL);
}
子进程执行结束后,应该退出吧,exit(0);
|
呵呵,你好!我也在看这段代码。但是在我机器(suse 10)上ORIG_EAX编译不通过,请问你知道什么原因吗?你那编译通过了吗?
以下摘自别人的:
说明:11是execve的系统调用号,这是该程序调用的第一个系统调用。
想知道系统调用号的详细内容,察看 /usr/include/asm/unistd.h。
在以上的示例中,父进程fork出了一个子进程,然后跟踪它。在调用exec函数之前,子进程用PTRACE_TRACEME作为第一个参数调用了ptrace函数,它告诉内核:让别人跟踪我吧!然后,在子进程调用了execve()之后,它将控制权交还给父进程。当时父进程正使用wait()函数来等待来自内核的通知,现在它得到了通知,于是它可以开始察看子进程都作了些什么,比如看看寄存器的值之类。
出现系统调用之后,内核会将eax中的值(此时存的是系统调用号)保存起来,我们可以使用PTRACE_PEEKUSER作为ptrace的第一个参数来读到这个值。
我们察看完系统调用的信息后,可以使用PTRACE_CONT作为ptrace的第一个参数,调用ptrace使子进程继续系统调用的过程。
以下摘自别人的:
说明:11是execve的系统调用号,这是该程序调用的第一个系统调用。
想知道系统调用号的详细内容,察看 /usr/include/asm/unistd.h。
在以上的示例中,父进程fork出了一个子进程,然后跟踪它。在调用exec函数之前,子进程用PTRACE_TRACEME作为第一个参数调用了ptrace函数,它告诉内核:让别人跟踪我吧!然后,在子进程调用了execve()之后,它将控制权交还给父进程。当时父进程正使用wait()函数来等待来自内核的通知,现在它得到了通知,于是它可以开始察看子进程都作了些什么,比如看看寄存器的值之类。
出现系统调用之后,内核会将eax中的值(此时存的是系统调用号)保存起来,我们可以使用PTRACE_PEEKUSER作为ptrace的第一个参数来读到这个值。
我们察看完系统调用的信息后,可以使用PTRACE_CONT作为ptrace的第一个参数,调用ptrace使子进程继续系统调用的过程。
|
不需要,执行完之后,返回0。因为,你的main函数最后有个返回0嘛
|
pid_t getppid();
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。