小编cad*_*luk的帖子

如何在套接字上正确使用 select()?

我正在尝试调用select套接字,但我无法理解我做错了什么。

setup_server_socket调用bindlisten设置套接字为非阻塞模式。

以下代码select似乎阻塞了调用,而不是前进到FD_ISSET. 我尝试连接客户端,它似乎成功但select从未返回任何内容。

这样做的正确方法是什么?

...
int listenfd = setup_server_socket( serverPort );

if( -1 == listenfd )
    return 1;

fd_set read_fds;
FD_ZERO(&read_fds);
int fdmax = listenfd;


// loop forever
while( 1 )
{
    if (select(fdmax+1, &read_fds, NULL,NULL,NULL) == -1){
        perror("select");
        exit(4);
    }

    for (int i = 0; i<= fdmax; i++){
        printf("Testing: %d, %d\n", i, FD_ISSET(i,&read_fds));

    }return 0;
...
Run Code Online (Sandbox Code Playgroud)

c sockets select

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

多级分页如何节省内存?

我对多级分页方案的概念感到困惑。

让一个 32 位虚拟地址和一个页面为 4 KiB,那么我将有 2 20页/页表条目。
设一个页表条目的大小为 4 个字节,因此页表的大小为 2 20 * 4 个字节。

如果我把虚拟地址分成10 | 10 | 12,那么我的理解是:

我有一个页表目录,它由虚拟地址的最高有效 10 位索引,因此它有 2 10个条目并指向 2 10 个不同的页表(即,在第二级)。
每2电平表再次可以通过(中间)10位和相应的条目将持有的实际页帧号来索引。

我的问题是:

  • 这是正确的吗?
  • 页目录和页表的大小是否相同?
  • 多级分页方案如何节省内存?

paging x86 operating-system virtual-address-space

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

Htop进程查看器-设置列宽

我尝试扩大htop列的宽度。我在这里找到了一个解决方案,但它看起来非常具体而且也太困难了。有没有更简单的方法使一列中的所有字符都可见?

linux htop

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

glibc的套接字实现在哪里?

在glibc 2.22中,在/socket目录中找到套接字库实现.
但是,当打开任何这些文件时,我看到的只是一个错误设置功能,下面有一些宏.
这是一个示例文件(/socket/send.c):

#include <errno.h>
#include <sys/socket.h>

/* Send N bytes of BUF to socket FD.  Returns the number sent or -1.  */
ssize_t
__send (fd, buf, n, flags)
     int fd;
     const __ptr_t buf;
     size_t n;
     int flags;
{
  __set_errno (ENOSYS);
  return -1;
}
libc_hidden_def (__send)
weak_alias (__send, send)

stub_warning (send)
Run Code Online (Sandbox Code Playgroud)

(删除了许可证评论.)

那是哪里sendweak_alias宏有作为参数?这些宏在哪里定义?
我认为这是由于与一些糟糕的旧编译器的兼容性,但为什么他们仍然使用K&R语法?
最重要的是,为什么这样 __send 定义?

c sockets posix glibc

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

从函数readdir释放(删除)已分配的内存

我在Linux环境中使用C编程语言来读取目录中的文件.我已经包含#include<dirent.h>在我的代码中并使用了该函数readdir().

根据Linux在线页面,它说不会调用free()结果指针到dirent结构,因为它可能被分配在堆栈上.

你能帮我理解它是如何工作的吗?我不明白为什么我们不必删除struct dirent.什么时候删除谁删除它?

以下是我所说的摘录:

成功时,readdir()返回指向dirent结构的指针.(此结构可以静态分配;不要尝试free(3)它.)如果到达目录流的末尾,NULL则返回并且errno不会更改.如果发生错误,NULL则返回并errno适当设置.

c linux malloc free stack

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

“中断挂钩”是什么意思?

我正在阅读PnP BIOS 规范并偶然发现以下段落:

主动监控 INT 19h 引导向量

当前的系统 BIOS 架构允许选项 ROM 不加选择地挂钩 INT 19h。通过主动监控 INT 19h 的控制,系统 BIOS 可以重新获得对引导过程的控制,以确保从正确的设备以正确的方式加载操作系统。

在第 3 行,提到了“挂钩”中断的可能性。据我所知,这意味着监视中断的发出,例如在每个 ISR 中调用一个特殊的通知函数,让操作系统跟踪触发的中断。那是对的吗?
这是什么意思?

x86 operating-system terminology interrupt

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

在x86机器上触发中断时,CR3是否会更改?

在x86机器上,触发中断时,CR3是否会更改(不仅仅是EIP的值)?

paging x86 assembly intel interrupt

4
推荐指数
1
解决办法
529
查看次数

如何在C / C ++中释放数组

int main() {
    // Will this code cause memory leak?
    // Do I need to call the free operator?
    // Do I need to call delete?
    int arr[3] = {2, 2, 3};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 此代码是否会造成内存泄漏?

  2. arr居住在哪里?在堆栈上还是在RAM中?

c c++ memory-leaks memory-management

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

同步和异步I/O之间的区别

我一直在学习操作系统的内部结构,我对同步和异步I/O之间的基本区别感到困惑.
操作系统如何知道它是同步还是异步?

operating-system

4
推荐指数
1
解决办法
1万
查看次数

为什么无论如何都会评估 ifelse 宏的“错误”表达式?

我写了一个小的 m4 脚本 ( test.m4) 用于测试目的:

define(`test', `ifelse(`$#', `1', `$1', test(shift($@)))')
test(`arg1', `arg2')
Run Code Online (Sandbox Code Playgroud)

并用m4 test.m4 -t test -de1运行它。输出是

m4trace: -1- test -> ifelse(`2', `1', `arg1', test(shift(`arg1',`arg2')))
m4trace: -2- test -> ifelse(`1', `1', `arg2', test(shift(`arg2')))
m4trace: -3- test -> ifelse(`1', `1', `', test(shift(`')))
m4trace: -4- test -> ifelse(`1', `1', `', test(shift(`')))
.
.
.
Run Code Online (Sandbox Code Playgroud)

直到由于超出递归限制而中止执行。我想知道为什么会这样,因为实际上1并且1应该比较相等并且if else宏应该评估为`'.

但是,我有一个创新的想法,将[not-equal]放入引号中,因此宏看起来像这样:

define(`test', `ifelse(`$#', `1', `$1', `test(shift($@))')')
test(`arg1', `arg2')
Run Code Online (Sandbox Code Playgroud)

瞧,它就像一个魅力(即,arg2与领先的换行符一起打印出来)。 …

if-statement m4

4
推荐指数
1
解决办法
92
查看次数