小编ern*_*rn0的帖子

如何为Android设备编写死的简单本机SERVER程序(不是应用程序)?

首先,我相信,这不是一个重复的问题.我不想用NDK编写本机应用程序,我只想将Android设备用作廉价的Linux 服务器.在此上下文中,服务器表示没有UI的程序.此外,服务器是用裸C++编写的,但根本不使用任何库,所以这就是为什么这个问题与其他问题不同.

故事

我们为Linux编写了一个小型服务器,它有一个webserver接口,所以你用一个vanilla浏览器连接它,你可以玩它.我们已将其编译为Linux/x86,Linux/ARM(GuruPlug),Linux/PPC(某种NAS)和Mac OS X Darwin平台.

Linux/ARM版本在我的PalmPré智能手机上运行良好.我刚刚将可执行文件复制到我的手机上(在webOS场景中,没有像越狱这样的东西,有一个官方的"开发者模式",如果你通过输入一个密钥组合激活,你可以用ssh登录你的手机或使用本地ssh应用程序).因此,即使是最小的Linux设备,我们的小型服务器程序(守护程序,可能会说)也在运行.(将千兆级桌面计算机的浏览器连接到智能手机服务器时,这很有趣.)

服务器程序设计为即使在最小的Linux上运行(正如我所说,它运行在NAS,路由器,智能手机上),它只需要STDLIB和PTHREADS.

这个问题

在Android设备上运行简单的服务器程序的直接方法是什么?

  • 我们还没有Android设备.但我认为,任何基于ARM的都可以.服务器的内存占用空间很小,没问题.
  • 我假设,设备必须是root用户才能将可执行文件复制到它并运行.
  • 我不想在设备上安装全新的Linux.它应该继续运行Android,而我们的服务器在后台运行.对于Dalvik而言足够的Linux发行版对我们的服务器来说已经足够了,我很确定.
  • 服务器不应该使用外部设备(USB,触摸屏,音频,摄像头,麦克风 - 谢谢,而不是)仅用于网络服务器的端口(例如8080),这不是由Android分配的.
  • 我有ARM GCC工具链,它的安装不是问题的一部分(除非有技巧).
  • 程序的安装应该是手动的(scp,无论如何).此外,我不想制作包或任何自动部署.
  • 启动服务器程序的问题是另一个问题,我们现在忽略了.

所以,我想用Andrid设备(手机,平板电脑)做同样的事情,就像我在我的webOS设备上做的那样:复制服务器程序并运行它.计算机就是这样,运行程序,不是吗?;)

linux android native pthreads

10
推荐指数
2
解决办法
844
查看次数

在ab中调用函数(C/C++)的官方方法是什么?在Linux上每1/100秒?

我有一个用C++编写的异步数据流系统.在数据流体系结构中,应用程序是一组组件实例,它们在启动时初始化,然后它们使用预定义的消息相互通信.有一种称为Pulsar的组件类型,它为连接到其中一个组件的其他组件提供"时钟信号消息"(例如,延迟).它每隔X ms触发一次消息(调用数据流调度程序API),其中X是"frequency"参数的值,以ms为单位.

简而言之,任务只是在每X ms调用一个函数(方法).问题是:最好/官方的方式是什么?它有什么模式吗?

我找到了一些方法:

  • 使用SIGALRM.我认为,信号不适合这个目的.尽管如此,分辨率是1秒,这太罕见了.
  • 使用HW中断.我不需要这种精确性.此外,我知道使用硬件相关的解决方案(服务器是为几个平台编译的,例如ARM).
  • 测量经过的时间,然后用usleep()直到下次呼叫.我不确定这是通过5个线程来测量与时间相关的系统调用的时间的最佳方法,每秒10次 - 但也许我错了.
  • 使用RealTime内核函数.我什么都不知道.此外,我不需要晶体精确调用,它不是一个atomreactor,我不能在某些平台上安装RT内核(也就是2.6.x Kernel可用).

也许,最好的答案是音频/视频播放器的源代码(我自己无法找到/理解)的一个简短评论部分.

更新(由@MSalters请求):DF项目的共同作者正在使用Mac OSX,因此我们应该找到适用于大多数Posix-Compilant操作系统的解决方案.系统,不仅仅是在Linux上.也许,将来会有一个使用BSD的目标设备,或者一些受限制的Linux.

c c++ linux real-time timer

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

无法在 Linux 上编译为 .wasm

概括

\n

(编辑:删除了所有不必要的信息,添加了Windows10体验,将Ubuntu上的CLANG升级到相同版本,由于旧的CLANG版本而删除了Debian10)

\n

我创建了一个非常简单的 WASM 模块,

\n
    \n
  • 在 MacOS 上编译,适用于 \xe2\x9c\x85,
  • \n
  • 在 MS-Windows10 上编译,适用于 \xe2\x9c\x85,
  • \n
  • 在 Ubuntu21.10 上编译:生成 318 字节的零 \xe2\x9d\x8c,
  • \n
\n

细节

\n

症状

\n

在 Ubuntu21 上,链接器生成长度正确但全是零的文件:

\n
$ hexdump inc.wasm\n0000000 0000 0000 0000 0000 0000 0000 0000 0000\n*\n0000130 0000 0000 0000 0000 0000 0000 0000\n000013e\n
Run Code Online (Sandbox Code Playgroud)\n

编译器还会生成一个名为 like 的临时文件inc.wasm.tmp611a2df,该文件与结果相同inc.wasm、大小相同、内容为零。

\n

构建命令

\n

编译命令:

\n
clang++ \\\n    --target=wasm32 \\\n    -nostdlib \\\n    -O3 \\\n    -o /tmp/inc.o \\\n    -c \\\n    inc.cpp\n …
Run Code Online (Sandbox Code Playgroud)

linux llvm clang webassembly

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

有没有办法将Linux管道设置为非缓冲或行缓冲?

我的程序在Linux上控制外部应用程序,通过管道将输入命令传递到外部应用程序stdin,并通过外部应用程序stdout的管道读取输出结果.

问题是对管道的写入是按块缓冲的,而不是按行缓冲的,因此在我的应用程序接收外部应用程序输出数据之前会发生延迟.无法更改外部应用程序以添加显式fflush()调用.

当我将外部应用程序设置为/ bin/cat -n(它回显输入,添加了行号)时,它正常工作,看起来,在每行之后刷新.强制外部应用程序刷新的唯一方法是向它发送exit命令; 当它收到命令时,它会刷新,所有答案都会在退出之前出现在标准输出上.

我很确定,Unix管道对于那种进程间通信(伪服务器 - 客户端)来说是合适的解决方案,但也许我错了.

(我刚刚从一个类似的问题中复制了一些文本:使用Python强制另一个程序的标准输出无缓冲)

c linux pipe flush

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

标签 统计

linux ×4

c ×2

android ×1

c++ ×1

clang ×1

flush ×1

llvm ×1

native ×1

pipe ×1

pthreads ×1

real-time ×1

timer ×1

webassembly ×1