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()