Articles of freebsd

如何在不修改FreeBSD,OpenBSD和Linux的情况下使用bash脚本?

对不起,标题可能有点刺激,但我什么都不知道。 无论如何,我想要一个bash脚本在FreeBSD,OpenBSD和Linux上工作,而不用修改它,但是bash不在Linux和BSD中的相同位置。 所以,如果我写#!/bin/bash那么它将不能在BSD上工作,因为bash shell位于/usr/local/bin/bash中。 有什么解决scheme让这个脚本同时工作吗? 还是我真的需要运送两个不同path的脚本…?

make for linux / freebsd的替代方法?

linux / freebsd有什么替代方法?

如何创build一个仅在pthread链接时才使用互斥体的库?

我正在Linux上创build一个C库,它有几个function,它们共同操作一些全局数据。 为了使这些函数成为线程安全的,他们必须在代码中的适当位置使用互斥锁。 在Linux中,为了在应用程序中使用pthread,需要在适当的库中链接-lpthread 。 在编译我的库的情况下,如果它的用户决定在他们的应用程序中使用pthreads,并且他们不这样做,我想让它工作。 在开发人员在应用程序中不使用线程的情况下,它们不会与pthreads链接。 因此,我希望我编译的库不要求它,而且,在单线程应用程序中使用互斥体使用不必要的开销(更不用说是愚蠢的)。 是否有某种方式来编写代码(如果有必要,使用GCC扩展)只有某些符号被链接时,某个代码块才会运行? 我知道我可以使用dlopen()和朋友,但是这本身就需要一些我想要避免的东西。 我想我所要找的东西必须存在,因为几个标准函数在同一条船上,并且需要互斥体是线程安全的(而且是互斥的),但是即使不与pthread链接,也能工作。 在这一点上,我注意到66&67行上的FreeBSD的popen()函数使用了非可移植的检查 – isthreaded ,以确定是否使用线程,以及是否使用互斥锁。 我怀疑这样的东西是否以任何方式标准化。 但是更重要的是,如果符号不被识别,那么这样的代码就不能编译和链接,而在Linux中,如果pthread没有链接,互斥符号将不会存在。 总结一下:在Linux上,如何创build一个库,它知道什么时候使用线程,如果是,在适当的情况下使用互斥锁,并且不需要链接到pthread,除非应用程序开发人员特别想在某处使用线程。

如何在Linux上运行aout?

问题是如何在Linux系统上执行aout格式的二进制文件(我的意思是在FreeBSD迁移到ELF之前使用的旧格式)。 有没有可能这样做没有额外的编码(有一些现有的解决scheme)? 可能它应该是Linux内核的内核模块或补丁的forms。 另一个解决scheme可能是用户空间启动器(甚至可能是运行时链接器)。 我已经search了类似的东西,但无法find一些东西。 我还没有检查系统调用接口的差异,如果你有这方面的意见,欢迎提供他们。 PS我知道写静态二进制用户空间启动器是相当微不足道的,但问题是关于一些现有的解决scheme。

在Linux和FreeBSD之间使bash脚本可移植的正确方法是什么?

我正在编写一些我想在我的Linux和FreeBSD系统上工作的bash脚本。 由于我主要在Linux上工作,所以我习惯于用我的bash脚本启动 #!/bin/bash 但是由于bash位于/usr/local/bin/bash所以在FreeBSD上不起作用。 所以在FreeBSD上,我的脚本需要开始 #!/usr/local/bin/bash 那么还有什么我可以使用的,可以跨两个系统移植吗? 我宁愿不维护两个版本的脚本。

使用VisualVM通过防火墙连接到远程jstatd实例

可能重复: VisualVM over ssh 我正在写这个问题并回答这个问题,因为我花了几个小时才把这个工作交给我,而我在这里find的答案却没有为我工作。 希望这对其他人有帮助。 如果你有另一个解决scheme,而不是我最终使用的解决scheme,请随时回答这个问题。 如果你的更好,我会接受你的。 问题:我试图用VisualVM和jstatd监视FreeBSD服务器上的一些自制Java应用程序(这也适用于Linux服务器),但是我无法让VisualVM列出服务器上的进程,即使在我转发我的防火墙中分配的和随机的jstatd端口,并可以看到使用sockstat进行的连接。

为什么用grep -q退出代码141?

有人可以解释为什么我从下面得到退出代码141? #!/usr/bin/bash set -o pipefail zfs list | grep tank echo a ${PIPESTATUS[@]} zfs list | grep -q tank echo b ${PIPESTATUS[@]} cat /etc/passwd | grep -q root echo c ${PIPESTATUS[@]} 我明白了 … a 0 0 b 141 0 c 0 0 从我的理解退出代码141是失败,但上面的行给零,所以它应该是成功,我会说。

在Linux和BSD中使用和不使用shebang的Bash脚本执行

如何和谁决定什么时候执行一个Bash类的脚本作为一个二进制文件执行没有shebang? 我想用 shebang运行一个正常的脚本是用binfmt_script Linux模块来处理的,它会检查一个shebang,parsing命令行并运行指定的脚本解释器。 但是如果有人在不使用shebang的情况下运行脚本,会发生什么? 我已经testing了直接执行execv方法,发现那里没有内核魔法 – 即像这样的文件: $ cat target-script echo Hello echo "bash: $BASH_VERSION" echo "zsh: $ZSH_VERSION" 运行只执行execv调用的编译的C程序会产生: $ cat test-runner.c void main(){ if(execv(“./ target-script”,0)== -1) PERROR(); } $ ./test-runner ./target-script:执行格式错误 但是,如果我从另一个shell脚本执行相同的操作,它将使用与原始shell解释器相同的shell解释器运行目标脚本: $ cat test-runner.bash #!/斌/庆典 ./target-script $ ./test-runner.bash 你好 bash:4.1.0(1) – 释放 zsh的: 如果我对其他shell执行相同的技巧(例如,Debian的默认sh – /bin/dash ),它也可以工作: $ cat test-runner.dash #!/斌/破折号 ./target-script […]

什么时候os.environ 不符合os.getenv('foo')?

我有一个小的Python应用程序,通过subprocess.Popen启动,它以环境variables的forms接受一些参数。 我通过将环境结构传递给Popen调用来做到这一点。 程序然后通过os.getenv读取variables。 或者说,它曾经以这种方式读取它们。 在Windows上,它工作正常。 但是在我们的FreeBSD服务器上, os.getenv对于我们传入的所有参数都返回None 。奇怪的是, os.environ的值很好 – 事实上,只需将所有os.getenv('foo')调用切换到os.environ['foo']在两个平台上都能正常工作。 为什么这些价值观不同? 什么时候适合于另一个?

与专有库链接的GPL代码是否取决于首先创build的代码?

微软创build了自己的windows和MFC的DLL库等等。一个开源的开发者编写一个新的MFC应用程序,并以GPL的forms发布源代码。 该应用程序必须链接到MS DLL /库运行在Windows中,但我不认为任何人都可以争辩说,我们现在有权强制微软的GPL DLL。 这是否意味着GPL许可实际上取决于哪一个是“创build”的? 如果首先创build专有库(例如Windows DLL),而不是链接和任何GPL代码发布,然后GPL程序与其链接,则GPL程序不能将专有库转换为GPL,尽pipe专有代码是“链接“与GPL代码。 如果是这种情况,那么NVidia或RealNetworks公司可以执行以下操作吗? 我们假设他们喜欢将专有的HDDecoding媒体解码引擎库保留为私有的,但他们也想“利用”开源的GPL代码来展示他们的硬件。 他们创build一个专有的库来进行媒体解码并发布一些示例代码。 有人(开源开发)创build“插件”,该插件链接到这个专有库中,用于GPLed代码,如XBMC,Mplayer或VLC。 他们可以争辩说,因为他们首先创build了专有库(就像MS首先创build所有的DLL一样),与他们专有代码链接的GPL程序不会将它们转换成GPL代码。 理论上可以说,创build与NVidia专有媒体解码器库链接的GPL vlc.exe文件的开源开发者违反了GPL许可证。 这是否意味着在Windows中运行的所有GPL程序(如VLC,git,cygwin等)都违反了GPL许可证,因为它们肯定需要与专有的Microsoft Windows Libraries链接才能运行。 案例2:这有什么问题: NVidia可以创build一个隐藏最新graphicsfunction的新硬件抽象库。 他们还使用这个库创build一个FreeBSD驱动程序,并释放BSD驱动程序的源代码,但不是库源代码。 有人(Linux开发人员)可以实现与该库链接的Linux驱动程序,以便为Linux创build一个NVidiagraphics驱动程序。 但是由于NVidia没有这样做,他们可以在启用“Linux支持”的同时保持图书馆资源“隐藏”。 这当然违反了GPL的精神。 这是否意味着在Windows / Mac / Iphone / PSP3上运行任何使用GPLed源码创build的exe文件也违反了GPL的精神?