ISO C和POSIX都不提供在运行时确定底层操作系统的功能.从理论的角度来看,无关紧要,因为C为最常见的系统调用提供包装,从挑选的角度来看,甚至不必是底层操作系统.
但是,在许多实际场景中,已经证明有必要了解有关主机环境的信息,而不是C愿意共享,例如为了找出存储配置文件的位置或如何调用select(),所以:
对于用C编写的应用程序来说,在运行时确定底层操作系统是否有惯用的方法?
至少,我可以轻松地在Linux,Windows,BSD和MacOS之间做出决定吗?
我目前的猜测是检查某些文件/目录的存在,例如C:\或/,但这种方法似乎不可靠.也许查询一系列这样的来源可能有助于建立"操作系统指纹"的概念,从而提高可靠性.无论如何,我期待着你的建议.
可以stdout文件描述符不同1(STDOUT_FILENO)假设stdout不必修改的左值?
例如,可以freopen("/dev/null", "w", stdout)改变fileno(stdout)结果吗?
如何在Docker上运行*BSD(Open,Free等)?
我正在使用Docker for Mac.
但是Docker Hub上没有BSD映像.
我该怎么办呢?
对于拥有新硬件的日常用户而言,如果有人正在寻找Windows的替代品,那么对我来说,这似乎是很自然的选择.但是什么时候尝试BSD变体是有意义的?
任何人都知道为什么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对这些选择一无所知!:|
我正在尝试使用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) 我在我的脚本中使用两次stat来查找文件文件权限,一次查找文件的大小.
`stat -c %A "$directory/$file"`
`stat -c %s "$directory/$file"`
Run Code Online (Sandbox Code Playgroud)
我使用的是OSX 10.7,目录和文件是我所在的当前目录和文件的变量.
我正在学习pf安装在Macbook(OS X Mountain Lion)上的数据包过滤器.
我无法理解的一件事是锚点,或者更具体地说,关于锚点的某些特征.你可以用以下形式编写锚点anchor "foo/*".请注意锚名称末尾的星号.我的问题是:这是做什么的?
这就是文档(http://www.openbsd.org/faq/pf/anchors.html)关于这个主题的内容:
由于锚可以嵌套,因此可以指定评估指定锚中的所有子锚:
Run Code Online (Sandbox Code Playgroud)anchor "spam/*"此语法会导致评估附加到垃圾邮件锚点的每个锚点中的每个规则.子锚将按字母顺序进行评估,但不会递归递归.始终相对于定义它们的锚点来评估锚点.
当我读到这个时,它意味着这个锚定义被spam按字母顺序替换为所有子锚.所以,如果spam/foo1和spam/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) 我有兴趣在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()获得一个结果的答案,我也会对此感兴趣.
鉴于此示例输入:
Run Code Online (Sandbox Code Playgroud)ID Sample1 Sample2 Sample3 One 10 0 5 Two 3 6 8 Three 3 4 7
我需要使用AWK生成此输出:
Run Code Online (Sandbox Code Playgroud)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
这就是我解决它的方式:
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)