当前位置: 技术问答>linux和unix
100分悬赏一个问题,有一定难度
来源: 互联网 发布时间:2015-12-27
本文导语: 面试中遇到的一个问题: 怎么判断六个exec函数中的某一个,是系统调用,还是通过系统调用实现的普通函数? 我的想法是在一个进程开始,设置ITIMER_VIRTUAL的定时器,比如经过2秒的进程用户时间超时,然后让另外...
面试中遇到的一个问题:
怎么判断六个exec函数中的某一个,是系统调用,还是通过系统调用实现的普通函数?
我的想法是在一个进程开始,设置ITIMER_VIRTUAL的定时器,比如经过2秒的进程用户时间超时,然后让另外一个exec不断调用自己,如果这个exec是系统调用的话,那么进程的用户时间就永远不会增加,那么这个定时器也就永远不会产生SIGVTALRM信号,反之,如果过一段时间超时,那么就说明这个exec不是系统调用了。但是,实验结果是6个exec都会超时,这是为什么?难道我的系统实现中6个exec都不是系统调用?如果是我的方法有问题,那么到底怎样才能判断它是不是系统调用那?请高人指点...
我的代码如下:
#include
#include
#include
#include
int main()
{
struct itimerval value;
value.it_value.tv_sec=2;
value.it_value.tv_usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_VIRTUAL,&value,NULL);
execl("./callself","callself",NULL);
perror("Failed to execl");
return 1;
}
callself只是不断地调用自己,代码如下
#include
int main(int argc,char **argv)
{
execl("./callself","callself",NULL);
//execle("./callself","callself",NULL,NULL);
//execlp("./callself","callself",NULL);
//execv("./callself",&argv[0]);
//execve("./callself",&argv[0],NULL);
//execvp("./callself",&argv[0]);
perror("Failed to exec");
return 1;
}
我的系统是FC3,gcc版本是3.4.2
怎么判断六个exec函数中的某一个,是系统调用,还是通过系统调用实现的普通函数?
我的想法是在一个进程开始,设置ITIMER_VIRTUAL的定时器,比如经过2秒的进程用户时间超时,然后让另外一个exec不断调用自己,如果这个exec是系统调用的话,那么进程的用户时间就永远不会增加,那么这个定时器也就永远不会产生SIGVTALRM信号,反之,如果过一段时间超时,那么就说明这个exec不是系统调用了。但是,实验结果是6个exec都会超时,这是为什么?难道我的系统实现中6个exec都不是系统调用?如果是我的方法有问题,那么到底怎样才能判断它是不是系统调用那?请高人指点...
我的代码如下:
#include
#include
#include
#include
int main()
{
struct itimerval value;
value.it_value.tv_sec=2;
value.it_value.tv_usec=0;
value.it_interval=value.it_value;
setitimer(ITIMER_VIRTUAL,&value,NULL);
execl("./callself","callself",NULL);
perror("Failed to execl");
return 1;
}
callself只是不断地调用自己,代码如下
#include
int main(int argc,char **argv)
{
execl("./callself","callself",NULL);
//execle("./callself","callself",NULL,NULL);
//execlp("./callself","callself",NULL);
//execv("./callself",&argv[0]);
//execve("./callself",&argv[0],NULL);
//execvp("./callself",&argv[0]);
perror("Failed to exec");
return 1;
}
我的系统是FC3,gcc版本是3.4.2
|
呵呵,我是这么测试的,可以写一个很简单的调用exec函数的小程序,得到该程序的进程号,然后,strace -p 进程号,你就会跟踪到该程序的系统调用,然后,我发现,其他exec函数都是调用execve函数的.一般情况下,只有execve是系统调用
怎么用程序测试呢?我就不知道了,期待……
怎么用程序测试呢?我就不知道了,期待……
|
呵呵,没有一个是直接调用系统调用,都是有一段用户代码的!只是有个是基础的。
我记得应该 execve是基础的
我记得应该 execve是基础的
|
exec函数不管是不是完全的系统调用,但是肯定会用到系统调用。这个面试题觉得没什么意思,有点抠字眼的感觉。
其实我一般是根据man 2 , man 3来区分...
其实我一般是根据man 2 , man 3来区分...
|
直接strace 不就可以了?呵呵。。