Articles of c + +

文件描述符和文件句柄(和C)

有人可以正确地向我解释文件描述符和文件句柄之间的区别(与Windows的术语定义不同,我对它们的定义感到好奇,但这需要更长的回答)? 根据我从维基百科获得的信息,文件描述符是文件描述符表中的一个索引,它指向文件表中的文件名,该文件名又指向inode表中的inode。 文件句柄是一种存储文件描述符的数据结构。 文件描述符只是文件描述符表中的一个索引(即索引值只是文件描述符)? 还是由它的索引标识的文件描述符表元素存储文件描述符(假设索引是一个数字,使它们可能是两个不同的数字)? “文件句柄”只是C语言中存储文件描述符的FILE数据结构的术语吗? 还是文件句柄指的是一些其他的数据结构,它存储一个文件描述符,与C数据结构(FILE)分开? 还有谁能告诉我关于文件句柄数据结构的性质?

为什么C中的全局数组(初始化)不能完全算作PSS

envirenment:gcc版本4.8.4(Ubuntu 4.8.4-2ubuntu1〜14.04)3.16.0-30-generic#40〜14.04.1-Ubuntu SMP Thu Jan 15 17:45:15 UTC 2015 i686 i686 i686 GNU C代码a2.c:有一个40MB的全局数组,每个项目都被分配。 int b[10000000];//40M global array void main() { int i = 0; for(i = 0; i<10000000; i++) {b[i]=i;} while(1); } 我build立像gcc -o a2 a2.c 当我运行这个代码,看到smap文件cat /proc/25739/smaps ,内容如下 08048000-08049000 r-xp 00000000 08:11 46930087 /home/jzd/test/a2 Size: 4 kB Rss: 4 kB Pss: 4 kB […]

在展开堆栈之前得到回溯

我的进程不在debugging器上运行,而是在发生崩溃时生成核心文件。 更新:崩溃发生由于exception。 从一个throw(),它甚至不在main()范围内处理。 当我将它附加在debugging器中运行它时,它会正确生成回溯,但是在核心文件中却不会。 问题可能是操作系统在传递控制权终止之前展开堆栈,因此当终止生成SIGABT时,它没有关于先前堆栈的信息。 我得到这个崩溃的压力记忆testing,所以我不可能在gdb下执行这个任务。 该怎么办 ? 任何步行

如何将无符号long longtypes的ticks转换为可读的时间格式?

我必须编写一个Linux的内核模块,它写入所有进程的开始时间。 我使用struct task_struct来获取有关进程的信息。 struct task_struct *task = get_current(); struct task_struct *head; struct list_head *current_list; struct rtc_time time; list_for_each(current_list, &task->tasks) { head = list_entry(current_list, struct task_struct, tasks); rtc_time64_to_tm(head->se.exec_start, &time); printk(KERN_INFO "%d:%d:%d %d/%d/%d", time.tm_hour, time.tm_min, time.tm_sec, time.tm_year, time.tm_mon, time.tm_yday); } rtc_time64_to_tm()的参数long long ,但head->se.exec_starttypes是unsigned long long 。 这就是为什么我不能将其转换为可读的时间格式。 // Convert seconds since 01-01-1970 00:00:00 to Gregorian date. void […]

当父子有一个处理程序时,父shell没有得到SIGINT

当你按下Ctrl-C时,前台进程收到SIGINT: $ bash -c 'sleep 100; echo program died' ^C $ echo $? 130 但是,如果程序安装了SIGINT处理程序,父程序不会收到信号。 为什么? #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <stdlib.h> #include <stdio.h> void sig_int(int sig_num) { exit(1); } static struct sigaction sigact = { .sa_handler=sig_int }; int main(int argc, char *argv[]) { sigaction(SIGINT,&sigact,NULL); sleep(100); return 0; } bash没有死: $ bash -c […]

GTK + 3线程安全吗?

我有一个有多个线程的应用程序。 一些线程正在使用构build在pthread API之上的库。 通过文档阅读,似乎有一次你必须调用gdk_threads_enter和gdk_threads_leave 。 但看着这些文档,整个文档似乎都被弃用了。 现在他们说你需要从主线完成所有的事情。 但是在main_thread进入gtk_main()之后,我应该如何向那个线程发信号,例如刷新一些小部件,比如我从另一个线程中dynamic构build的菜单,这个线程从REST Web服务中拉取菜单项并且长时间运行。 我想我不应该根据文档从其他线程那样做。 尽pipe它有一把锁,但看起来还是有效的。 我偶尔会碰到碰撞,而且我不确定是否因为这个原因。

如何转换十进制值在C ++中的波斯语字符?

我使用波斯语(UTF-8)工作。 我想将其转换为hex。 但我的问题是第一如何转换在Linux操作系统中的c + +十进制值的波斯语字符?(我使用Qt的创造者)

在Linux上,当使用C执行与端口0(select一个随机端口)的套接字绑定时,我得到了errno 98,地址已经在使用。 这怎么可能?

所以,我们有一个长期以来的商业产品,这是很好的,我从来没有见过这种types的问题。 我们使用客户端程序将数据发送到服务器。 有时,由于客户环境中的防火墙,我们允许最终用户指定绑定的出站端口范围,但是,在我看到的这个特定问题中,我们没有这样做,并且正在使用端口0来执行绑定。 从我读过的一切,这意味着select一个随机的端口。 但是我找不到的是,这对内核/操作系统意味着什么。 如果我要求一个随机的端口,那怎么可能已经在使用? 严格地说,只有src ip / src port&dst ip / port的唯一配对使连接唯一。 我相信可以使用相同的端口,如果谈到另一个目的地的IP,但也许这不相关。 而且,这不会发生在所有客户的系统上,只有一些。 所以,这可能是某种forms的负载相关问题。 我被告知系统相当繁忙。 这是我们正在使用的代码。 我忽略了一些ifdef的代码,而忽略了我们为了简短而做的事情。 _SocketCreateClient(Socket_pwtP sock, SocketInfoP sInfo ) { int nRetries; /* number of times to try connect() */ unsigned short port; BOOL success = FALSE; BOOL gotaddr = FALSE; char buf[INET6_ADDRSTRLEN] =""; int connectsuccess =1; int ipv6compat […]

C中的数据包嗅探器适用于所有虚拟机

我有3个代表客户端/服务器/攻击者的Ubuntu VM。 我创build了一个连接客户端和TCP服务器的应用程序,并且在攻击者机器中有一个数据包嗅探器。 但是,代码只能嗅探攻击者机器上的数据包,并不能检测到客户机/服务器连接。 我试过Wireshark,它捕获了它们之间的连接。 你觉得问题是什么? 我正在使用虚拟盒,networking桥接。 这是代码 #include <pcap.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netinet/ip.h> #include <netinet/tcp.h> pcap_t* handle; int linkhdrsize; char filter[256]; /* – Packet Capture function – */ pcap_t* packet_capture(char* device, const char* bpfstr) { char errorbuffer[PCAP_ERRBUF_SIZE]; pcap_t* handle; uint32_t […]

在内核模块中没有键盘中断

我正在做一个项目,根据收到的键盘中断进行一些操作。 所以我注册了键盘中断,并将中断标记为共享。 但是我的程序没有按照它应该的工作。 为了debugging这个问题,我编写了一个小程序,只要注册键盘中断,并在收到键盘中断时向内核输出一些消息。 但是当中断率很高的时候,我发现很多键盘的中断都被遗漏了。 例如,在下面的示例代码中,当“a”被按下时,我注册中断并输出消息给内核。 从计数器值来看,总的中断次数less于键盘产生的实际中断次数。 我通过将按键回显到terminal并计算回应给terminal的a的数量来发现这一点。 因此,例如,如果在terminal上有350个回声,则计数将只有300-320。 更高数量的中断也是如此。 中断的数量越多,错过的中断越多,但错过的中断的百分比似乎在所有情况下几乎相等。 有人可以解释这是什么原因吗? 提前致谢。 以下是源代码。 #include <linux/kernel.h> #include <linux/interrupt.h> #include <linux/module.h> #include <linux/signal.h> #include <asm/io.h> /* The keyboard ISR */ irq_handler_t irq_handler (int irq, void *dev_id, struct pt_regs *regs) { static int count = 0; static unsigned char scancode; scancode = inb (0x60); if (0x1E == […]