kotlin native 调用linux c wait函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32768743/article/details/87167383
wait(null)

这么写是不行的
点进去
看到要传一个CValue的类型

public fun wait(__stat_loc: kotlinx.cinterop.CValue<platform.posix.__WAIT_STATUS>): platform.posix.__pid_t /* = kotlin.Int */ { /* compiled code */ }

还有一个类叫wait

public final class wait public constructor(rawPtr: kotlinx.cinterop.NativePtr /* = kotlin.native.internal.NativePtr */) : kotlinx.cinterop.CStructVar {
    public companion object : kotlinx.cinterop.CStructVar.Type {
    }

    public final val __wait_stopped: platform.posix.anonymousStruct21 /* compiled code */

    public final val __wait_terminated: platform.posix.anonymousStruct20 /* compiled code */

    public final var w_status: kotlin.Int /* compiled code */
}

我在 csapp ch10.3练习题 遇到的问题
代码中wait是这样写的

wait(NativePtr.NULL)

调到了类的构造函数
一个可以调用的写法是

    wait(cValue())

有没有副作用目前还不清楚,因为wait还牵涉到一个类

public final class __WAIT_STATUS public constructor(rawPtr: kotlinx.cinterop.NativePtr /* = kotlin.native.internal.NativePtr */) : kotlinx.cinterop.CStructVar {
    public companion object : kotlinx.cinterop.CStructVar.Type {
    }

    public final var __iptr: kotlinx.cinterop.CPointer<kotlinx.cinterop.IntVar /* = kotlinx.cinterop.IntVarOf<kotlin.Int> */>? /* compiled code */

    public final var __uptr: kotlinx.cinterop.CPointer<platform.posix.wait>? /* compiled code */
}

而且c函数是
在这里插入图片描述
最后输出正确结果的代码

package csapp

import kotlinx.cinterop.*
import platform.posix.*
import kotlin.native.internal.NativePtr

fun main() {
    val fd = open("foobar.txt", O_RDONLY, 0)
    val buffer = ByteArray(1024)
    if (fork() == 0) {
        buffer.usePinned { pinned ->
            read(fd, pinned.addressOf(0), 1)
            exit(0)
        }
    }

    wait(cValue())
    buffer.usePinned { pinned ->
        read(fd, pinned.addressOf(0), 1)
        println("c = ${buffer[0].toChar()}")
    }
    exit(0)
}

猜你喜欢

转载自blog.csdn.net/qq_32768743/article/details/87167383