标签: bsd

在运行时确定OS

ISO C和POSIX都不提供在运行时确定底层操作系统的功能.从理论的角度来看,无关紧要,因为C为最常见的系统调用提供包装,从挑选的角度来看,甚至不必底层操作系统.

但是,在许多实际场景中,已经证明有必要了解有关主机环境的信息,而不是C愿意共享,例如为了找出存储配置文件的位置或如何调用select(),所以:

对于用C编写的应用程序来说,在运行时确定底层操作系统是否有惯用的方法?

至少,我可以轻松地在Linux,Windows,BSD和MacOS之间做出决定吗?

我目前的猜测是检查某些文件/目录的存在,例如C:\/,但这种方法似乎不可靠.也许查询一系列这样的来源可能有助于建立"操作系统指纹"的概念,从而提高可靠性.无论如何,我期待着你的建议.

c linux windows macos bsd

7
推荐指数
1
解决办法
5713
查看次数

7
推荐指数
1
解决办法
1318
查看次数

如何在Docker上运行*BSD OS?

如何在Docker上运行*BSD(Open,Free等)?

我正在使用Docker for Mac.
但是Docker Hub上没有BSD映像.
我该怎么办呢?

bsd docker

7
推荐指数
1
解决办法
2141
查看次数

在哪种情况下,建议选择BSD系统而不是Linux?

对于拥有新硬件的日常用户而言,如果有人正在寻找Windows的替代品,那么对我来说,这似乎是很自然的选择.但是什么时候尝试BSD变体是有意义的?

linux bsd operating-system

6
推荐指数
2
解决办法
460
查看次数

BSD md5与GNU md5sum输出格式?

任何人都知道为什么BSD md5程序以这种格式产生哈希输出......

MD5 (checksum.md5) = 9eb7a54d24dbf6a2eb9f7ce7a1853cd0
Run Code Online (Sandbox Code Playgroud)

...而GNU md5sum会产生更合理的格式吗?

9eb7a54d24dbf6a2eb9f7ce7a1853cd0 checksum.md5
Run Code Online (Sandbox Code Playgroud)

据我所知,md5sum格式更容易解析,更有意义.你怎么md5sum -check用md5?什么-p,-q,-r,-t,-x选项意味着什么?man md5对这些选择一无所知!:|

bsd md5 gnu

6
推荐指数
2
解决办法
9758
查看次数

将select()用于非阻塞套接字

我正在尝试使用select函数在服务器和1个客户端(不再)之间进行非阻塞i/o,其中通信流畅(可以随时发送而另一个将在不等待发送的情况下接收).我找到了一些包含一些代码的教程,并尝试将其改编为我的.这就是我所拥有的 -

服务器

#define PORT "4950"
#define STDIN 0

struct sockaddr name;

void set_nonblock(int socket) {
    int flags;
    flags = fcntl(socket,F_GETFL,0);
    assert(flags != -1);
    fcntl(socket, F_SETFL, flags | O_NONBLOCK);
}


// get sockaddr, IPv4 or IPv6:
void *get_in_addr(struct sockaddr *sa) {
    if (sa->sa_family == AF_INET)
        return &(((struct sockaddr_in*)sa)->sin_addr);

    return &(((struct sockaddr_in6*)sa)->sin6_addr);
}

int main(int agrc, char** argv) {
    int status, sock, adrlen, new_sd;

    struct addrinfo hints;
    struct addrinfo *servinfo;  //will point to the results

    //store the connecting address and size …
Run Code Online (Sandbox Code Playgroud)

c sockets select bsd

6
推荐指数
2
解决办法
5万
查看次数

Binutils stat非法选项-c

我在我的脚本中使用两次stat来查找文件文件权限,一次查找文件的大小.

 `stat -c %A "$directory/$file"`
 `stat -c %s "$directory/$file"`
Run Code Online (Sandbox Code Playgroud)

我使用的是OSX 10.7,目录和文件是我所在的当前目录和文件的变量.

macos bsd gnu stat binutils

6
推荐指数
1
解决办法
4753
查看次数

PF数据包过滤器:带星号的锚如何工作?

我正在学习pf安装在Macbook(OS X Mountain Lion)上的数据包过滤器.

我无法理解的一件事是锚点,或者更具体地说,关于锚点的某些特征.你可以用以下形式编写锚点anchor "foo/*".请注意锚名称末尾的星号.我的问题是:这是做什么的?

这就是文档(http://www.openbsd.org/faq/pf/anchors.html)关于这个主题的内容:

由于锚可以嵌套,因此可以指定评估指定锚中的所有子锚:

anchor "spam/*"
Run Code Online (Sandbox Code Playgroud)

此语法会导致评估附加到垃圾邮件锚点的每个锚点中的每个规则.子锚将按字母顺序进行评估,但不会递归递归.始终相对于定义它们的锚点来评估锚点.

当我读到这个时,它意味着这个锚定义被spam按字母顺序替换为所有子锚.所以,如果spam/foo1spam/foo2会存在,anchor "spam/*"将被替换anchor "spam/foo1"anchor "spam/foo2".spam锚点内的其他规则将被忽略.但是看看默认的OS X配置我一定是错的:

$ pfctl -sr
scrub-anchor "com.apple/*" all fragment reassemble
anchor "com.apple/*" all

$ pfctl -a com.apple -sr
anchor "100.InternetSharing/*" all
anchor "200.AirDrop/*" all
anchor "250.ApplicationFirewall/*" all
anchor "300.NetworkLinkConditioner/*" all
Run Code Online (Sandbox Code Playgroud)

所以,根据我的理解,输出pfctl -sr也可以是:

$ pfctl -sr
scrub-anchor "com.apple/*" all fragment reassemble
anchor "100.InternetSharing/*" all
anchor …
Run Code Online (Sandbox Code Playgroud)

macos bsd firewall

6
推荐指数
0
解决办法
2342
查看次数

如何在OSX上迭代所有已安装的文件系统

我有兴趣在OSX上迭代所有挂载的文件系统(目前运行10.9 Mavericks).我正在寻找类似于getmntent()或mount shell命令的输出(尽管我想从目标C中执行此操作,因此解析shell命令的输出显然不是最佳的).

我一直在查看磁盘仲裁框架,看来我可以使用此框架通知mount和unmount事件.我可能在那里遗漏了一些东西,但我不清楚是否有办法使用磁盘仲裁迭代现有的已安装文件系统.

我已经探索过使用getfsent(),它似乎会提供一个解决方案,但经过测试后我发现我没有从迭代getfsent()获得多个条目.请参阅以下代码:

struct fstab* fsentry;
setfsent();
fsentry = getfsent();
while(fsentry)
{
    //do something with fsentry
    fsentry = getfsent();
}
endfsent();
Run Code Online (Sandbox Code Playgroud)

我到这里的唯一条目是/ file系统.第二次调用getfsent()时,它返回NULL,好像没有更多的条目.mount命令向我展示了其他几个包括已安装的cifs/smb文件系统:

/dev/disk0s2 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
//user@<ip address>/public on /Volumes/public (smbfs, nodev, nosuid, mounted by user)
Run Code Online (Sandbox Code Playgroud)

所以似乎getfsent()开始做我期望的,但由于某种原因停止?

总结我的问题是:在OSX上迭代文件系统的最佳方法是什么?

如果有人对我为什么只从getfsent()获得一个结果的答案,我也会对此感兴趣.

macos bsd posix diskarbitration osx-mavericks

6
推荐指数
1
解决办法
3280
查看次数

计算任意列数的百分比

鉴于此示例输入:

ID     Sample1     Sample2      Sample3
One      10          0            5
Two      3           6            8
Three    3           4            7
Run Code Online (Sandbox Code Playgroud)

我需要使用AWK生成此输出:

ID    Sample1 Sample2 Sample3
One   62.50   0.00    25.00
Two   18.75   60.00   40.00
Three 18.75   40.00   35.00
Run Code Online (Sandbox Code Playgroud)

这就是我解决它的方式:

function percent(value, total) {
    return sprintf("%.2f", 100 * value / total)
}
{
    label[NR] = $1
    for (i = 2; i <= NF; ++i) {
        sum[i] += col[i][NR] = $i
    }
}
END {
    title = label[1]
    for (i = 2; i <= length(col) + …
Run Code Online (Sandbox Code Playgroud)

awk bsd

6
推荐指数
1
解决办法
122
查看次数