Unix Fork 异常行为
Unix Fork Strange Behavior
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int function(void* dat){
sleep(5);
printf("Executed Child Process...\n");
return 5;
}
void dupliFork(int *childpid, int *funcRet, int *func(void*), void* data){
int id = fork();
if(id==0) *funcRet = *func(data);
else *childpid=id;
printf("Returned dupliFork with id %d\n", id);
}
int main(void){
int childpid=0, funcRet=0;
dupliFork(&childpid, &funcRet, function, NULL);
printf("Waiting for Child Process with id %d...\n", childpid);
waitpid(childpid, NULL, 0);
printf("Child Process Terminated with return value %d...\n", funcRet);
}
您好,我无法理解上述代码的工作原理...
执行上面的代码时,我得到输出:
Returned dupliFork with id 4941
Waiting for Child Process with id 4941...
Executed Child Process...
Child Process Terminated with return value 0..."
这非常令人沮丧,因为我期待以下输出:
Returned dupliFork with id 4941
Waiting for Child Process with id 4941...
Executed Child Process...
Returned dupliFork with id 0
Child Process Terminated with return value 5...
这令人沮丧,因为似乎在分叉之后,
原始的 duplifork 功能完美运行。
但是,它的副本调用另一个函数,
并需要 return 值才能继续执行,
从来没有那样做。
有人可以向我解释一下实际上是什么吗
发生在这里?提前谢谢你。
你的函数指针语法错误。
int *func(void*)
应该是:
int (*func)(void*)
和:
if(id==0) *funcRet = *func(data);
应该是:
if(id==0) *funcRet = func(data);
进行这些更改,您将得到类似于:
paul@horus:~/src/sandbox$ ./fork
Returned dupliFork with id 69707
Waiting for Child Process with id 69707...
Executed Child Process...
Returned dupliFork with id 0
Waiting for Child Process with id 0...
Child Process Terminated with return value 5...
Child Process Terminated with return value 0...
paul@horus:~/src/sandbox$
因为除了父进程之外,您还(可能错误地)拥有子进程 wait()
。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int function(void* dat){
sleep(5);
printf("Executed Child Process...\n");
return 5;
}
void dupliFork(int *childpid, int *funcRet, int *func(void*), void* data){
int id = fork();
if(id==0) *funcRet = *func(data);
else *childpid=id;
printf("Returned dupliFork with id %d\n", id);
}
int main(void){
int childpid=0, funcRet=0;
dupliFork(&childpid, &funcRet, function, NULL);
printf("Waiting for Child Process with id %d...\n", childpid);
waitpid(childpid, NULL, 0);
printf("Child Process Terminated with return value %d...\n", funcRet);
}
您好,我无法理解上述代码的工作原理... 执行上面的代码时,我得到输出:
Returned dupliFork with id 4941
Waiting for Child Process with id 4941...
Executed Child Process...
Child Process Terminated with return value 0..."
这非常令人沮丧,因为我期待以下输出:
Returned dupliFork with id 4941
Waiting for Child Process with id 4941...
Executed Child Process...
Returned dupliFork with id 0
Child Process Terminated with return value 5...
这令人沮丧,因为似乎在分叉之后, 原始的 duplifork 功能完美运行。 但是,它的副本调用另一个函数, 并需要 return 值才能继续执行, 从来没有那样做。 有人可以向我解释一下实际上是什么吗 发生在这里?提前谢谢你。
你的函数指针语法错误。
int *func(void*)
应该是:
int (*func)(void*)
和:
if(id==0) *funcRet = *func(data);
应该是:
if(id==0) *funcRet = func(data);
进行这些更改,您将得到类似于:
paul@horus:~/src/sandbox$ ./fork
Returned dupliFork with id 69707
Waiting for Child Process with id 69707...
Executed Child Process...
Returned dupliFork with id 0
Waiting for Child Process with id 0...
Child Process Terminated with return value 5...
Child Process Terminated with return value 0...
paul@horus:~/src/sandbox$
因为除了父进程之外,您还(可能错误地)拥有子进程 wait()
。