小编Fin*_*fin的帖子

emacs:选择时关闭缓冲区列表

当在这样的窗口中选择缓冲区时,是否有配置挂钩使" 缓冲区列表 "缓冲区自动关闭?每次缓冲区列表打开并且我选择一个缓冲区时我必须手动关闭它 C-x C-k ,这很烦人,也因为它让帧分割成至少两个窗口.

emacs elisp

14
推荐指数
1
解决办法
2993
查看次数

waitpid阻止它不应该

我正在写一个迷你shell(不,不是为了学校:P;为了我自己的乐趣),大部分基本功能现在已经完成,但我在尝试处理SIGTSTP时遇到困难.

据推测,当用户按下时Ctrl+Z,SIGTSTP应该被发送到shell的Foreground进程(如果存在),并且Shell应该正常继续.

创建每个进程后(如果它是Foreground进程),以下代码等待:

if(waitpid(pid, &processReturnStatus, WUNTRACED)>0){//wait stopped too
    if(WIFEXITED(processReturnStatus) || WIFSIGNALED(processReturnStatus))
        removeFromJobList(pid);
}
Run Code Online (Sandbox Code Playgroud)

我正在处理如下信号:

void sigtstpHandler(int signum)
{
    signum++;//Just to remove gcc's warning
    pid_t pid = findForegroundProcessID();
    if(pid > -1){
        kill(-pid, SIGTSTP);//Sending to the whole group
    }
}
Run Code Online (Sandbox Code Playgroud)

会发生什么事情,当我按下时Ctrl+Z,子进程确实被挂起(ps -all用于查看进程的状态)但我的shell挂起waitpid它永远不会返回,即使我通过了WUNTRACED标志,据我所知,它应该waitpid返回时这个过程也停止了.
那么我可能做错了什么呢?还是我理解waitpid的行为不正确?

注意:
-findForegroundProcessID()返回正确的pid; 我仔细检查了一下.
- 我正在改变每个进程的组,直到我fork
-Handling Ctrl+C工作正常 -
如果我在shell挂起后使用另一个终端发送SIGCONT,子进程恢复其工作并且shell最终收获它.
- 我正在捕捉SIGTSTP,只要我读到(并测试过)就可以捕获. - 我尝试使用waitid而不是waitpid以防万一,问题仍然存在. 编辑:

void sigchldHandler(int signum)
{
    signum++;//Just to remove the warning
    pid_t pid; …
Run Code Online (Sandbox Code Playgroud)

c linux shell signals wait

11
推荐指数
1
解决办法
7170
查看次数

对签名数据进行逻辑右移

在此之前,这不是我的作业,它是由一本名为"计算机系统程序员的视角"的书给出的实验室(优秀的书btw)

我需要在有符号整数上执行逻辑移位,而不使用以下任何内容:

  • 铸件
  • if,while,select,for,do-while,?:
  • 任何类型的指针

允许的运营商是:!+〜| >> << ^

到目前为止我尝试了什么?

/* 
 * logicalShift - shift x to the right by n, using a logical shift
 *   Can assume that 0 <= n <= 31
 *   Examples: logicalShift(0x87654321,4) = 0x08765432
 *   Legal ops: ~ & ^ | + << >>
 *   Max ops: 20
 *   Rating: 3 
 */
int logicalShift(int x, int n) {
    int mask = ~0;
    int shiftAmount = 31 + ((~n)+1);//this evaluates to 31 - n on two's …
Run Code Online (Sandbox Code Playgroud)

c c++ x86 bit-manipulation bit-shift

9
推荐指数
2
解决办法
6785
查看次数

可变长度与Malloc-ed数组

根据c99标准,我们可以编写以下代码,这是完全合法的

int x;
scanf("%d",&x);
int ar[x];
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我可以分配这样的数组,为什么我需要malloc再次分配可变大小的数组?

另外,请您解释一下可变长度数组的分配情况如何?内心深处,是否调用malloc来分配数组或者是什么?

c arrays

8
推荐指数
2
解决办法
1672
查看次数

内联asm是ANSI C标准的一部分吗?

我一直认为这是因为许多IDE和语法突出显示工具没有在C中突出显示ASM,但它们总是使用C++.内联汇编是否是C标准(ANSII或ISO)的一部分?

c c++ inline-assembly

8
推荐指数
1
解决办法
3649
查看次数

如何计算TCP校验和

我正在编写一个内核模块,它使用Netfilter挂钩修改一些TCP头信息,显然,在发送之前,我想重新计算校验和.
我也在接收端编辑标题,所以我也需要在那里重新计算它.

在网上搜索,我发现有些人说我可以简单地将它设置为0并且它将为我计算,显然这不起作用.
我也发现了这个功能

tcp_v4_send_check(struct sock *sk, struct sk_buff *skb);
Run Code Online (Sandbox Code Playgroud)

虽然没有人解释如何使用它,以及我是否可以在接收/发送时以相同的方式使用它.
我自己的尝试是将校验和设置为0然后调用此函数传递我拥有的skb和我拥有的skb-> sk,仍然没有.

那么请问,计算TCP数据报校验和的简单方法是什么?

c linux networking network-programming linux-kernel

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

Char*p和scanf

我一直试图寻找以下代码失败的原因,我找不到一个.请原谅我的无知,让我知道这里发生了什么.

#include<stdio.h>
int main(void){
char* p="Hi, this is not going to work";
scanf("%s",p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,我创建了一个指针p到内存大小为29 + 1的连续区域(对于\ 0).为什么我不能使用scanf来改变它的内容?

PS请纠正我如果我说char*有问题.

c scanf

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

使用 sk_buff 添加以太网帧头

我有一个内核模块可以捕获传出的 Internet 流量(Netfilter 钩子:LOCAL_OUT)在这个钩子上,仍然没有以太网头。

我构建了以太网标头并且它可以使用了,但是如何将它附加到skb以便我可以将整个 skb 结构发送到dev_queue_xmit()?

是否有任何关于如何操作 sk_buff 数据的指南,您可以提供给我以获取更多信息?

作为示例,我尝试对所有 ECHO ICMP 流量执行我想做的操作;这是我的代码。但是当在另一台机器上使用 Wireshark 进行检查时,我得到了一个有效的以太网报头但一个空的 IP 数据包......怎么会?

static unsigned int post_icmp_check(unsigned int hooknum,
                 struct sk_buff *skb,
                 const struct net_device *in,
                 const struct net_device *out,
                 int (*okfn)(struct sk_buff *))
{
  struct iphdr *iph;
  struct icmphdr *icmph;
  struct sk_buff *sb;
  struct ethhdr *ethh;
  unsigned char *frame = NULL; //Used just to copy the skb->data and replace it, that's all
  unsigned char *ptr;

  /* Allocations and initial assignations …
Run Code Online (Sandbox Code Playgroud)

c kernel netfilter kernel-module linux-kernel

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

我们可以在不断开图表的情况下删除边缘吗?

在我开始之前,是的,这是一个功课.如果我在最近的14个小时里没有尽力解决这个问题并且无处可去,我就不会在这里发布.

问题如下:我想检查是否可以从连接的无向图中删除边,而不是在O(V)时间内断开它,而不仅仅是线性的.

到目前为止我所达到的目标:

可以在不断开图形的情况下移除循环边缘,因此我只需检查图形是否具有循环.我有两种方法可以使用,一种是DFS,然后检查我是否有后边缘; 另一种是通过计算Vs和Es并检查是否| E | = | V | - 1,如果那是真的那么图是一棵树,我们可以删除没有节点而不断开它.

以前的两种方法都解决了这个问题,但两者都需要O(| E | + | V |),书中说有更快的方法(这可能是一种贪婪的方法).

我可以得到任何提示吗?

编辑:更具体地说,这是我的问题; 给定一个连通图G =(V,E),我可以删除E中的一些边e并使结果图仍然连接吗?

algorithm graph greedy

5
推荐指数
1
解决办法
4883
查看次数

如何捕获内核模块中的网络帧

我想在某个NIC收到帧时捕获它们; 从中提取一些信息(目前我需要捕获源MAC和源IP地址); 将这些信息保存在一些公共数据结构中; 让框架以其方式进入TCP/IP堆栈.

我之前使用过Netfilter,但显然它没有提供Link层挂钩.
有什么方法可以做到这一点吗?

我把它写成一个内核模块; 运行Linux内核2.6.32

linux networking linux-kernel

5
推荐指数
1
解决办法
4021
查看次数