0

ユーザーから ncurses インターフェイスに送信されるすべてのイベントと、カーネル モジュールから netlink 経由で送信されるすべてのメッセージの両方を処理するために、アプリにイベント ループを記述する必要があります。

2 つの質問があります。

  1. ソケットをノンブロッキングにするにはどうすればよいですか? (fcntl(sock_fd, F_SETFL, O_NONBLOCK);たぶん/だけ?)

  2. fdepoll のイベントに追加できるように端末 (ncurses)を取得するにはどうすればよいですか?

これは私がソケットを開始する方法です:

int net_init(void){
    int sock_fd;
    struct sockaddr_nl src_addr, dest_addr;

    sock_fd = socket(PF_NETLINK, SOCK_RAW, get_netlink_id());  <---- autonegotiation with the kernel module.
    if(sock_fd < 0){
        return -1;
    }

    memset(&src_addr, 0, sizeof(src_addr));
    src_addr.nl_family = AF_NETLINK;
    src_addr.nl_pid = getpid();

    bind(sock_fd, (struct sockaddr *)&src_addr, sizeof(src_addr));

    memset(&dest_addr, 0, sizeof(dest_addr));
    memset(&dest_addr, 0, sizeof(dest_addr));
    dest_addr.nl_family = AF_NETLINK;
    dest_addr.nl_pid = 0;
    dest_addr.nl_groups = 0;

    nlh = (struct nlmsghdr *)new(NLMSG_SPACE(MAX_PAYLOAD));
    memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));
    nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);
    nlh->nlmsg_pid = getpid();
    nlh->nlmsg_flags = 0;

    strcpy(NLMSG_DATA(nlh), ""); <--- Send empty string to the kernel module so it knows to what PID it should send data

    iov.iov_base = (void *)nlh;
    iov.iov_len = nlh->nlmsg_len;
    msg.msg_name = (void *)&dest_addr;
    msg.msg_namelen = sizeof(dest_addr);
    msg.msg_iov = &iov;
    msg.msg_iovlen = 1;

    sendmsg(sock_fd, &msg, 0);

    return sock_fd;
}
4

1 に答える 1

1

(1) では通常fcntl、F_GETFL と共に使用し、返されたフラグを後続の F_SETFL 呼び出しに使用します。

 fcntl(sock_fd, F_SETFL, flags | O_NONBLOCK);

(2) これに対する絶対確実な答えを見たことがありません。私が知っているcurses apiには、そのファイル記述子を明らかにしたり、別のものを指定したりすることを許可するものは何もありません。私はstraceいくつかの単純なプログラムを実行しましたが、curses は盲目的に標準入力、出力、エラーに関係なく実行しました。isattyしたがって、おそらくstdoutが端末に接続されていること( )および/またはリダイレクトされていないことを確認した後、stdoutをポーリングする必要があると想定する以外に選択肢はないと思います。最も問題があると思います、標準エラー出力へ。

誰かがより大きな洞察力を持っているなら、私はそれを聞きたいです。

余談ですが、curses を別のスレッドに配置し、必要に応じてスレッド間で通信することを検討したかどうか疑問に思います。その理由は、それが非常に単純な curses インターフェイスでない場合、他のことを管理しながら自分が curses のどこにいるかを追跡しようとして、自分自身を結び目に結び付けるのは本当に簡単だからです。

于 2013-10-26T18:25:18.017 に答える