如果我加载内核模块并列出已加载的模块lsmod,我可以得到模块的"使用计数"(其他模块的数量与模块的引用).有没有办法弄清楚什么是使用模块?
问题是我正在开发的模块坚持它的使用计数为1,因此我不能用rmmod它来卸载它,但它的"by"列是空的.这意味着每次我想重新编译和重新加载模块时,我都必须重启机器(或者,至少,我无法找出任何其他方法来卸载它).
我试图理解如何使我的程序成为守护进程.所以我遇到的一些事情通常,程序执行以下步骤来成为守护进程:
fork( ).在父母中,打电话exit( ).这可以确保原始父级(守护程序的祖父级)满足其子级终止,守护程序的父级不再运行,并且守护程序不是进程组领导者.最后一点是成功完成下一步的要求.
调用setsid( ),为守护进程提供一个新的进程组和会话,两者都将其作为领导者.这也确保了进程没有关联的控制终端(因为进程刚刚创建了一个新会话,并且不会分配一个).
通过将工作目录更改为根目录chdir( ).这样做是因为继承的工作目录可以在文件系统上的任何位置.守护进程倾向于在系统正常运行时间内运行,并且您不希望保持一些随机目录打开,从而阻止管理员卸载包含该目录的文件系统.
关闭所有文件描述符.
/dev/null.#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>
int main (void)
{
pid_t pid;
int i;
/* create new process */
pid = fork ( );
if (pid == -1)
return -1;
else if (pid != 0)
exit (EXIT_SUCCESS);
/* create new session and process group */
if (setsid ( ) == -1) …Run Code Online (Sandbox Code Playgroud) 在最近的Java电话采访中我被问到这个问题:
您将获得具有以下属性的NxN二进制(0-1)矩阵:
例:
0 1 1
1 1 1
0 0 1
Run Code Online (Sandbox Code Playgroud)
每行中的位值被排序,行表示整数3,7和1.
找到表示最小整数的行.在上面的示例中,答案是第3行,它表示整数1.
我从二次复杂的蛮力开始.采访者回答说我没有利用排序的财产.
在思考了很多之后,我在每一行都使用了二元搜索,然后它来到了O(nlogn).他问我是否可以进一步改进.我想了很多但没有改进.
如果有人能提出任何关于改进它的指示,我将不胜感激.
另一个例子:
0 1 1 1
0 0 0 1
0 0 0 0
1 1 1 1
Run Code Online (Sandbox Code Playgroud)
答案是第3行,代表整数0.
手册页htonl()似乎暗示您只能将其用于最多32位值.(实际上,ntohl()定义为无符号长整数,在我的平台上是32位.我想如果无符号长整数是8个字节,它将适用于64位整数).
我的问题是我需要将64位整数(在我的例子中,这是一个无符号长long)从big endian转换为little endian.现在,我需要进行特定的转换.但ntohl()如果目标平台WAS大端,如果函数(如)不会转换我的64位值,它会更好.(我宁愿避免添加我自己的预处理器魔法来做到这一点).
我可以用什么?如果它存在,我想要标准的东西,但我愿意接受实施建议.我在过去使用过工会看过这种类型的转换.我想我可以拥有一个带有unsigned long long和char [8]的联合.然后相应地交换字节.(显然会在大端的平台上破解).
我正在寻找一些可供学习的开源F#项目.有些东西不是片段,而是完整的项目,它们是F#特征的良好代表(即模式匹配,有区别的联合等).
我的目标主要是看看所有功能如何组合在一起,项目如何组织以及如何从功能角度解决问题.
在C#深度(迄今为止一本优秀的书)中,Skeet解释事件不是字段.我多次阅读本节,我不明白为什么这种区别有所不同.
我是那些混淆事件和委托实例的开发人员之一.在我看来,它们是一样的.这两种都不是间接的形式吗?我们可以组播两者.事件被设置为字段作为简写...确定.但是,我们正在添加或删除处理程序.将它们堆叠起来以便在事件触发时调用.我们不要对委托做同样的事情,叠加它们并调用invoke吗?
float a = 0;
while (true)
{
a++;
if (a > 16777216)
break; // Will never break... a stops at 16777216
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释为什么浮点值在此代码中停止递增16777216?
编辑:
或者更简单:
float a = 16777217; // a becomes 16777216
Run Code Online (Sandbox Code Playgroud) 想象一下,我有一个启动多个子进程的进程.父母需要知道孩子什么时候退出.
我可以使用waitpid,但是如果/当父需要退出时,我无法告诉阻塞的线程waitpid优雅地退出并加入它.让事情自己清理是件好事,但这可能不是什么大不了的事.
我可以用waitpid用WNOHANG,然后睡了一段任意时间,以防止忙等待.然而,我只能知道一个孩子是否经常退出.在我的情况下,我知道孩子何时立即离开可能不是超级关键,但我想尽快知道...
我可以使用信号处理程序SIGCHLD,并在信号处理程序中执行当子项退出时要执行的任何操作,或者将消息发送到其他线程以执行某些操作.但是使用信号处理程序会稍微混淆代码流.
我真正想做的是使用waitpid一些超时,比如5秒.由于退出进程不是一个时间关键的操作,我可以懒惰地发出线程信号退出,同时仍然在waitpid其余时间阻塞它,随时准备做出反应.在linux中有这样的调用吗?在替代方案中,哪一个最好?
编辑:
基于回复的另一种方法是SIGCHLD用pthread\ 来阻塞所有线程_sigmask().然后在一个线程中,sigtimedwait()一边寻找一边打电话SIGCHLD.这意味着我可以超时调用并检查线程是否应该退出,如果没有,则保持阻塞状态等待信号.一旦a SIGCHLD被传递到这个线程,我们可以立即对它做出反应,并且在等待线程的行中,不使用信号处理程序.
我看到了一些有用属性的例子,例如(作为动态工厂的地图) http://msdn.microsoft.com/en-us/magazine/cc164170.aspx
只是想知道使用属性有什么好处?我可以在http://msdn.microsoft.com/en-gb/z0w1kczw(VS.80).aspx上找到参考资料 但是,我不知道何时以及为什么要尝试使用它.