我试着写我的“getpid”克隆,因为我有一个学校项目,getpid是禁止的函数。所以,我写了这段代码:
pid_t mini_getpid(void)
{
pid_t id;
id = fork();
if (id == 0)
exit(0);
else
{
wait(0);
return (id - 1);
}
}
字符串
我尝试使用fork函数获取主进程的pid。但是有一个问题。当我比较我的return和真实的getpid()函数时,我的函数总是返回多1。例如,如果getpid()的返回值是1000,那么由于fork函数,我的函数会返回1001。fork函数做错了什么,为什么它返回的PID值比它应该的值大1?
2条答案
按热度按时间laik7k3q1#
分叉returns the child's PID,到目前为止,它在您的机器和环境中一直比父代高1,这纯粹是运气。这不是保证内核可以为孩子分配任何有效的、未使用的PID。
如果你真的需要在不调用getpid C函数的情况下获取pid,你可以调用原始系统调用:
字符串
如果你的任务的精神是甚至不使用系统调用,你将不得不探索其他渠道,提供你需要的信息。最好的方法显然取决于你在任务中允许做什么和不允许做什么。
另一种可能的(但效率不高的)方法是在子进程和父进程之间建立某种通信通道(例如:共享内存、管道等)和子进程中的
getppid
调用。yquaqz182#
你正在对父pid和子pid之间的关系做出不应该做出的假设。子pid可以是任何东西,所以
child_pid - 1
不是获取父pid的正确方法。如果
getpid()
是唯一被禁止的函数,你可以在子进程中使用getppid()
(以获取父进程的pid),然后通过pipe
将其发送回父进程。举个例子添加错误检查将作为练习。
字符串