小编lbe*_*tto的帖子

为什么分叉我的进程会导致文件被无限读取

我把我的整个程序归结为一个复制问题的简短主题,所以原谅我没有任何意义.

input.txt是一个文本文件,其中包含几行文本.这个简化的程序应该打印这些行.但是,如果调用fork,程序将进入无限循环,在此循环中反复打印文件的内容.

据我所知,我在这个片段中使用它的方式本质上是一个无操作.它分叉,父母在继续之前等待孩子,孩子立即被杀死.

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

enum { MAX = 100 };

int main(){
    freopen("input.txt", "r", stdin);
    char s[MAX];

    int i = 0;
    char* ret = fgets(s, MAX, stdin);
    while (ret != NULL) {
        //Commenting out this region fixes the issue
        int status;
        pid_t pid = fork();
        if (pid == 0) {
            exit(0);
        } else {
            waitpid(pid, &status, 0);
        }
        //End region
        printf("%s", s);
        ret = fgets(s, MAX, stdin);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:进一步的调查只会使我的问题变得更加奇怪.如果文件包含<4个空白行或<3行文本,则不会中断.但是,如果不止于此,它会无限循环.

Edit2:如果文件包含3行数字,它将无限循环,但如果它包含3行单词则不会.

c fork

8
推荐指数
1
解决办法
688
查看次数

OnApplyWindowInsetsListener 给出始终为 0 的 systemWindowInsetBottom

systemWindowInsetBottom 和 stableInsetBottom 都是 0

我有一个 Activity,它有一个背景纹理,我使用 FLAG_LAYOUT_NO_LIMITS 让该背景位于状态和导航栏后面。但我不希望视图的其他内容落后于那些系统 UI 组件。

一开始我想使用resources.getIdentifier("navigation_bar_height", "dimen", "android")来获取导航栏的高度,但这只是导航栏的默认高度,因此它不适用于用户隐藏导航栏的设备。(三星设备)

然后我发现了 WindowInsets 和 android:fitsSystemWindows="true"

它适用于状态栏,但不适用于导航栏。

在我的活动中

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    //These 2 flags don't seem to change anything
    window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN)
    window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR)
    //This flag is required so the background can go behind the navbar
    window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)

    rootView.setOnApplyWindowInsetsListener { _, insets ->
        val topTextViewParams = rootView.tvTop.layoutParams as ViewGroup.MarginLayoutParams
        topTextViewParams.topMargin = insets.systemWindowInsetTop

        val bottomTextViewParams = rootView.tvBottom.layoutParams as ViewGroup.MarginLayoutParams
        bottomTextViewParams.bottomMargin = insets.systemWindowInsetBottom //Inset is always 0

        insets.consumeSystemWindowInsets() …
Run Code Online (Sandbox Code Playgroud)

android windowinsets

8
推荐指数
1
解决办法
3530
查看次数

在 MotionLayout 中以编程方式设置边距

我有一些视图需要以编程方式设置一些边距(来自 applyWindowInsets 侦听器),但这些视图似乎忽略了我用代码设置的任何边距,即使我没有为边距设置动画。

我可以很好地设置填充,但是仅使用填充无法完成我需要的操作。

该问题似乎与 MotionLayout 相关,因为如果它是 ConstraintLayout,它就可以正常工作。

我一直在使用这个 util 方法。

public static void addTopMargin(View v, int margin) {
    ((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin += margin;
}
Run Code Online (Sandbox Code Playgroud)

android android-motionlayout

7
推荐指数
1
解决办法
1087
查看次数

在 Dart 中按索引访问 List 元素的时间复杂度是多少?

Dart 中的列表是动态调整大小的,除非您在创建时指定大小。

所以我认为动态大小的会像 Java 中的 ArrayList 一样工作,而静态大小的会像 Java 中的 [] 一样工作。

这是正确的,还是总是 O(1) 访问?还是总是 O(n) 访问?

我一直无法在网上找到有关此的任何资源。

dart

5
推荐指数
1
解决办法
1297
查看次数

在 Kotlin 中检查 ArrayList 的类型

Kotlin 提供了 Array.isArrayOf() 来检查数组是否属于某种类型。

它是这样使用的

if(object.isArrayOf<String>())
Run Code Online (Sandbox Code Playgroud)

并像这样定义

/**
 * Checks if array can contain element of type [T].
 */
@Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE")
public fun <reified T : Any> Array<*>.isArrayOf(): Boolean =
    T::class.java.isAssignableFrom(this::class.java.componentType)
Run Code Online (Sandbox Code Playgroud)

但它仅适用于 Array。我需要检查ArrayList。

我想像这样改变签名。

@Suppress("REIFIED_TYPE_PARAMETER_NO_INLINE")
public fun <reified T : Any> ArrayList<*>.isArrayListOf(): Boolean =
    T::class.java.isAssignableFrom(this::class.java.componentType)
Run Code Online (Sandbox Code Playgroud)

但 class.java.componentType 特定于 Array

如何检查我拥有的 ArrayList 类型?

我应该澄清一下,我只关心它是否是 3 种类型之一,所以我不需要完全开放式的检查方式。

kotlin

5
推荐指数
2
解决办法
7022
查看次数

Proguard/R8 正在缩小 Jackson 的 Kotlin 数据类中的 @JsonProperty 注释名称

我有一些用于 Retrofit2 的类,并由 Jackson 序列化。

@JsonIgnoreProperties(ignoreUnknown = true)
class GetUserRequest(
    @JsonProperty("user_id")
    var userId: String? = null
)
Run Code Online (Sandbox Code Playgroud)

它们在调试版本中工作,但是当我在启用 proguard 或 R8 缩小的情况下执行发布版本时,它会缩小类变量(如预期),而且还会缩小 @JsonProperty 生成的任何代码,导致网络请求使用 json 发送,例如{ "a": "123" } 而不是 { "user_id": "123" }

我已经通过 jackson 实现“com.fasterxml.jackson.module:jackson-module-kotlin:2.9.9”实现“com.squareup.retrofit2:converter-jackson:2.6.0”包含了对 kotlin 的支持

我有一些适用于我的 java 类模型对象的 proguard 规则。

-keep class com.fasterxml.jackson.databind.ObjectMapper {
    public <methods>;
    protected <methods>;
}
-keep class com.fasterxml.jackson.databind.ObjectWriter {
    public ** writeValueAsString(**);
}
-keep class * {
     @com.fasterxml.jackson.annotation.JsonCreator *;
     @com.fasterxml.jackson.annotation.JsonProperty *;
}

-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**
-keep class …
Run Code Online (Sandbox Code Playgroud)

android proguard jackson kotlin retrofit2

5
推荐指数
1
解决办法
2612
查看次数

一旦传入新线程,套接字就会关闭

我正在尝试创建一个多线程双工聊天服务器.在将代码移动到线程之前,我已经正常工作了,但是现在当线程试图访问套接字时,我得到"SocketException:Socket已关闭".

我的老师和我无法理解.(老师比我更了解Java;他是C家伙).套接字似乎是打开的,但只要它进入线程,它就会被关闭.

我究竟做错了什么?

客户代码:

public class Client {
    public static void main(String[] args) throws IOException {
        String hostName = "localhost";
        int portNumber = 6969;
        try (
                Socket socket = new Socket(hostName, portNumber);
        ) {
            System.out.println("Chat connected");
            //Sender
            if (!socket.isClosed())
                new Thread(new Sender(socket)).start();
            //Receiver
            if (!socket.isClosed())
                new Thread(new Receiver(socket)).start();
        } catch (SocketException e) {
            System.out.println("Connection terminated unexpectedly");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

服务器代码:

public class Server {
    public static void main(String[] args) throws IOException {
        int portNumber = 6969;
        try (
                ServerSocket serverSocket …
Run Code Online (Sandbox Code Playgroud)

java sockets multithreading

3
推荐指数
1
解决办法
1029
查看次数