c - 无效指针类型转换为 pid_t 不正确

标签 c linux process multiprocessing

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

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 output 1: 19876
pid_t output 2: 19876
pid_t output 3: 493972479
Parent exiting

但我不知道为什么。如果我对 int 执行相同类型的取消引用,它会起作用,但是当我对 pid_t 执行相同的操作时,我会得到一个非常奇怪的值。

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

最佳答案

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

createProcess 函数中

*processHandle = &newTask;

在这里,您使 *processHandle 指向局部变量 newTask

createProcess 返回时,之前被 newTask 变量占用的内存不再“存在”(实际上它将被下一个函数调用重用),让你有一个杂散的指针。

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

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

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

关于c - 无效指针类型转换为 pid_t 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42642102/

相关文章:

c++ - gsl 中的 matlab mvnrnd

concurrency - 延迟语句是否使进程处于阻塞状态?

linux - 在 shell 脚本中使用标准输入

c++ - 如何限制特定进程的cpu使用率?

process - 在 C# DLL 生命周期内运行并终止 Selenium 服务器单例进程

c - 计算阶乘 > 31 时如何处理整数溢出

c - Store program.exe 已停止工作,我该如何解决它?

c - 使用 scanf() 函数进行 C 编程时出现意外输出

mysql - 从 shell 脚本将表导出为 mysql 中的 csv

linux - 将输入从一个 shell 传递到另一个 shell,然后再次返回输入