void指针类型错误地转换为pid_t

时间:2017-03-07 06:58:18

标签: c linux process multiprocessing

我遇到的问题是通过引用将pid_t作为void指针传递,然后将其类型转换回pid_t。我的代码如下:

public function update(UpdateRequest $request)
{
    // your additional operations before save here
    $redirect_location = parent::updateCrud($request);
    // your additional operations after save here
    // use $this->data['entry'] or $this->crud->entry
    return $redirect_location;
}

我的输出是:

typedef void * ProcessHandle_t;

void createProcess( ProcessHandle_t * processHandle )
{
    pid_t newTask = fork();

    if( newTask != 0 )
    {
        /* Parent process */
        /* Return a process handle for the main task to use */
        *processHandle = &newTask;
        printf("pid_t output 1: %d\n", *((pid_t *)*processHandle));
    } else
    {
        while(1){
            printf("Child running\n");
        }
    }

}

void deleteProcess( ProcessHandle_t processHandle )
{
    pid_t deleteTask = *((pid_t *)processHandle);

    printf("pid_t output 3: %d\n", deleteTask));

    kill(deleteTask, SIGKILL);
}

int main( )
{
    ProcessHandle_t processHandle;

    createProcess( &processHandle );

    printf("pid_t output 2: %d\n", ((pid_t *)*processHandle));

    deleteProcess( processHandle );

    printf("Parent exiting\n");

}

但我不明白为什么。如果我使用整数进行相同类型的解除引用,它可以工作,但是当我为pid_t执行相同操作时,我会得到一个非常奇怪的值。

是否有一个特定的原因,为什么这不适用于pid_t,但适用于其他变量类型?

1 个答案:

答案 0 :(得分:0)

请记住,一旦定义的函数返回,局部变量就会超出范围。

createProcess功能中

*processHandle = &newTask;

在此,您*processHandle指向本地变量 newTask

createProcess返回时,newTask变量先前占用的内存不再“存在”(实际上它将被下一个函数调用重用),留下一个迷路指针。 / p>

取消引用此指针将导致未定义的行为

如果要使用指针复制newTask的内容,则需要为复制的值分配内存,并实际值复制到新分配的内存中。如果你分配内存,那么你当然也必须释放它。

更简单的解决方案是根本不使用指针。避免指针通常是避免未定义行为和崩溃的一种非常好的方法。