那么你如何正确地做到这一点呢?
我知道如何通过创建套接字,然后使用 ioctl 设置 IFF_PROMISC 标志(如“如何检查 C 中的网络设备状态? ”和其他地方所述),但这至少在理论上看起来有缺陷。
有没有更好的方法,还是我只是担心太多?
后来我发现应该通过setsockopt(也没有比赛)向PACKET_MR_PROMISC添加接口,如下所示:
void set_promisc(const char *ifname, bool enable)
{
struct packet_mreq mreq = {0};
int sfd;
int action;
if ((sfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
perror("unable to open socket");
return;
}
mreq.mr_ifindex = if_nametoindex(ifname);
mreq.mr_type = PACKET_MR_PROMISC;
if (mreq.mr_ifindex == 0) {
perror("unable to get interface index");
return;
}
if (enable)
action = PACKET_ADD_MEMBERSHIP;
else
action = PACKET_DROP_MEMBERSHIP;
if (setsockopt(sfd, …
Run Code Online (Sandbox Code Playgroud) 据我了解,pthread_cond_timedwait将通过获取当前时间来使用,然后计算pthread_cond_timedwait应该在没有信号的情况下退出的绝对时间.
有一种简单的方法可以使用此函数可靠地执行周期性任务(问题是在当前时间点和调用pthread_cond_timedwait之间的时间变化)?
我有一个应该每秒运行一次的周期性任务.
do {
pthread_mutex_lock(mutex);
tx = gettimeofday + 1 second;
do_some_simple_periodic_task();
pthread_cond_timedwait(condition, mutex, tx);
pthread_mutex_unlock(mutex);
} while (!some_exit_condition);
Run Code Online (Sandbox Code Playgroud)
如果更新了上下文(包括some_exit_condition),则发出条件信号.
有没有办法使用单调计时器或类似的东西?如果没有,pthread_cond_timedwait的用例是什么?仅适用于您不关心延迟一小时的情况?
我已经看到了一个解决方案,其中另一个线程周期性地发出信号(如何使pthread_cond_timedwait()对系统时钟操作有效?),但它看起来像是一个黑客.
是否有一种不同的更好的方法让线程睡眠一段时间(不容易发生挂钟变化)但是立即对外部条件做出反应?
在C中是否有一些众所周知的嵌套错误处理模式/实践,比如Java中的嵌套异常?
使用通常的"只返回错误代码/成功"错误细节可能会丢失,然后程序才能确定它应该记录/报告错误.
想象一下类似于此的代码:
err B()
{
if (read(a/b/c/U.user) != OK) {
return read_error; //which would be eaccess or we could return even e_cannot_read_user
}
if (is_empty(read_user.name)) {
// we could tell exactly what is missing here
return einval;
}
...
}
err A()
{
if (B() != OK) {
if (cannot_handle_B_failing()) {
return e_could_not_do_b;
}
}
...
}
main()
{
...
if (A() != OK) && (no_alternative_solution()) {
report error_returned_by_A;
wait_for_more_user_input();
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人在C中成功尝试某种嵌套错误代码/消息?可以报告(主要)用户名丢失或由于权限无效而无法读取文件F的事实.
有没有图书馆来支持这样的事情?