问题标签 [posix]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
posix - 获取最高分配的文件描述符
是否有一种可移植的方式(POSIX)来获取当前进程的最高分配文件描述符编号?
例如,我知道有一种在 AIX 上获取号码的好方法,但我正在寻找一种可移植的方法。
我问的原因是我想关闭所有打开的文件描述符。我的程序是一个服务器,它以 root 身份运行,并为非 root 用户分叉和执行子程序。让特权文件描述符在子进程中打开是一个安全问题。一些文件描述符可能被我无法控制的代码(C 库、第三方库等)打开,所以我不能依赖FD_CLOEXEC
任何一个。
c - 在 POSIX C 中获取自己的外部 IP 地址
我正在寻找自己的 IP 地址,以便将该信息发布到对等网络中。在 POSIX/C 中,我们有getaddrinfo(NULL, ...)
,但这似乎总是返回INADDR_ANY
or INADDR_LOOPBACK
,这对我来说没用。
有什么建议么?
networking - 断开并重新连接已连接的数据报套接字
我正在尝试创建一个基于数据报套接字(UDP)的迭代服务器。它调用连接到它从第一个 recvfrom() 调用获得的第一个客户端(是的,我知道这不是真正的连接)。在为这个客户端提供服务后,我断开 UDP 套接字(使用 AF_UNSPEC 调用连接)然后我调用 recvfrom() 从下一个客户端获取第一个数据包。
现在的问题是,在循环的第二次迭代中调用 recvfrom() 将返回 0。我的客户端从不发送空数据包,所以会发生什么。
这就是我正在做的事情(伪代码):
编辑:我发现我的客户端错误地发送了一个空包。现在我的问题是如何让客户端等待获得服务而不是向任何地方发送请求(服务器连接到另一个客户端并且不为任何其他客户端提供服务)。
c - 主/工作线程和信号处理
我正在编写一个程序,有一个主线程和一些工作线程,我想正确处理信号。我的问题如下:
主线程启动并进行所有分配
主线程设置一个 SIGINT 信号处理程序
主线程启动工作线程。工作线程不需要特殊的清理,但是它们可以在系统调用或信号量上休眠。
当收到 SIGINT 时,我的理解是只有一个线程收到它。因此,如果线程在系统调用或信号量上处于休眠状态,它们将不会被唤醒,并且我将无法 pthread_join 我的工作线程并在我的主线程中进行所有必要的清理。
以下信号处理程序可以解决我的问题吗?
我期望的是,在收到 SIGINT 后,所有线程都会收到另一个信号,退出阻塞调用,看到g_do_cleanup
标志并优雅地退出。
欢迎任何关于如何正确执行此操作的评论或链接。
编辑:我不是在寻找一种方法来唤醒等待特定条件的多个线程,所以我不认为 pthread_cond_signal 方法是我正在寻找的。我想要的是:
- 找到一种方法,使在阻塞调用中被阻塞的所有线程都从这些调用中返回。
- 或者杀死除主线程之外的所有线程。
c++ - 等待多个事件 C++
是否有推荐的方法来等待多个输入。例如,我希望我的程序能够接收来自 3 个来源的输入:
监听线程条件,例如 pthread_cond_wait()
从标准输入中获取数据,例如 getline()
监听套接字,例如 accept()
实现这一目标的最佳方法是什么?每个不同的输入源都需要一个线程吗?谢谢
security - 使用 /dev/urandom 生成的秘密令牌是保护守护进程的好方法吗?
我有一个生成子进程的守护进程。有时这些子进程需要与守护进程进行通信。我想确保只有这些子进程被授权与守护进程通信。
我想按如下方式实现:
- 在启动期间,守护进程通过读取 /dev/urandom 生成一个随机的 128 字节秘密令牌。/dev/random 不好,因为它可能会在任意时间内阻塞阅读器。
- 守护进程侦听 Unix 域套接字。
- 守护程序将秘密令牌和套接字的文件名放在环境变量中。它产生的每个子进程都可以使用文件名和秘密令牌连接到守护进程。
- 除非秘密令牌正确,否则守护程序会拒绝连接。
问题:
- 我知道 /dev/random 的熵比 /dev/urandom 高。但是 /dev/urandom 是否足够好?如果没有,我应该使用什么?
- 令牌的大小是否足够大?
- 我应该锁定存储令牌的内存吗?我认为没有必要,因为守护程序每次启动时都会生成不同的令牌,所以当攻击者设法窃取硬盘驱动器并从交换文件中提取令牌时,它应该已经没用了。
- 我应该在关机期间取消存储令牌的内存吗?
- 还有什么我应该做的吗?
而且由于各种要求,我不能使用匿名管道来允许守护进程和子进程之间的通信。
linux - 重新定义信号处理缺陷
这是关于设计决策并了解采用其他服务的利弊。所以我们有两个服务和两个不相关的服务器,一个监听端口 10000,另一个是 xinetd 服务器通过 3 个不同的端口响应 3 个不同的请求(它的客户端使用 nc 服务器端口 1|端口 2|端口 3 来检索数据)。
有一天,因为安全问题,xinetd 服务器不得不停止,因为第一台服务器保留了相同的数据,我们决定采用 xinetd 服务器,向第一台服务器发送 USR1 信号,让它暴露相同的公共数据。因此,需要添加逻辑来重新定义第一台服务器中的信号处理。我们计划使用 USR1 (10, 16, 30) 例如,在 xinetd 服务器中, kill -10 first_server 会让第一台服务器吐出与旧服务器过去发出的相同的数据,并且仍然转储到第一个端口. 争论是这是一个糟糕的设计,因为它滥用了 unix 信号使用,当然还重新定义了 POXIS 和 Linux 预定义的 10、16 和 30 符号行为。这在技术上真的很糟糕吗?会对系统造成什么危害?
c - 信号安全使用 sem_wait()/sem_post()
我正在尝试在 Linux 上创建一个包装器,它控制一次允许多少个并发执行。为此,我使用了系统范围的计数信号量。我创建信号量,执行 a sem_wait()
,启动子进程,然后在子进程sem_post()
终止时执行 a 。没事儿。
问题是如何安全地处理发送到这个包装器的信号。如果它没有捕捉到信号,则命令可能会在不执行 a 的情况下终止sem_post()
,从而导致信号量计数永久减少 1。所以,我创建了一个信号处理程序来执行sem_post()
. 但是,还是有问题。
如果在sem_wait()
执行之前附加了处理程序,则信号可能会在sem_wait()
完成之前到达,从而导致 asem_post()
发生而没有sem_wait()
. 如果我sem_wait()
在设置信号处理程序之前执行此操作,则相反的情况是可能的。
显而易见的下一步是在设置处理程序和sem_wait()
. 这是我现在拥有的伪代码:
现在的问题是sem_wait()
罐子阻塞,在此期间,信号被阻塞。试图终止进程的用户最终可能会诉诸“kill -9”,这是我不想鼓励的行为,因为无论如何我都无法处理这种情况。我可以使用sem_trywait()
一小段时间进行测试sigpending()
,但这会影响公平性,因为不再保证等待信号量最长的进程接下来会运行。
这里有一个真正安全的解决方案,可以让我在信号量采集期间处理信号吗?我正在考虑求助于“我有信号量”全局并消除信号阻塞,但这并不是 100% 安全的,因为获取信号量并设置全局不是原子的,但可能比在等待时阻塞信号更好。
sockets - 获取仍然可用的随机高端口号
假设我想在 IPC 的某个端口上运行 TCP/IP 服务。当我将端口号传递给我想要与之通信的进程时,端口号并不重要。获取系统仍然可用的随机、高(通常 > 49152)端口号的最佳方法是什么?POSIX中有什么我可以使用的吗?
我知道 FTP 服务器经常需要这个。
linux - 消息队列在 linux 中过时了吗?
我最近一直在 Linux 中使用消息队列(System V,但 POSIX 也应该没问题),它们似乎非常适合我的应用程序,但是在阅读了 The Art of Unix Programming 我不确定它们是否真的是一个不错的选择.
http://www.faqs.org/docs/artu/ch07s02.html#id2922148
System V IPC 的上层消息传递层已基本停止使用。下层由共享内存和信号量组成,在需要在同一台机器上运行的进程之间进行互斥锁定和一些全局数据共享的情况下,仍然有重要的应用。这些 System V 共享内存设施演变成 POSIX 共享内存 API,支持 Linux、BSD、MacOS X 和 Windows,但不支持经典的 MacOS。
http://www.faqs.org/docs/artu/ch07s03.html#id2923376
System V IPC 设施存在于 Linux 和其他现代 Unix 中。但是,由于它们是遗留功能,因此它们并不经常使用。到 2003 年中期,Linux 版本仍然存在缺陷。似乎没有人足够关心来修复它们。
System V 消息队列在最近的 Linux 版本中是否仍然存在错误?我不确定作者是否意味着 POSIX 消息队列应该没问题?
似乎套接字是几乎所有东西的首选 IPC(?),但我看不出用套接字或其他东西实现消息队列是多么简单。还是我想的太复杂了?
我不知道我使用嵌入式 Linux 是否相关?