Tag: linux

fork()如何知道它是否在子进程和父进程中?

执行fork()系统调用时,处理器将进入内核模式。 因此,在fork调用结束时,生成了一个新进程,其中包含堆栈,用户数据和用户程序的副本。 那么fork如何在此时决定它是否在子进程中返回0并且如果它是主父进程那么它必须返回子进程的PID。 fork()被调用两次? 请解释。 我很迷惑 !!!

如何在gtk应用程序中执行定期作业?

我需要使用基于gtk的GUI创建一个应用程序,该应用程序检查socekets以查看传入的消息并显示收集的统计信息,而无需用户输入任何内容。 这怎么组织起来?

如何优化U-boot到内核切换代码?

平台:Xilinx Zynq SoC上的ARM Cortex A9上的Linux。 我问了一个问题: 为什么内核启动太晚了 基本上我试图理解,然后最小化这两个事件之间的延迟: [Sat Apr 12 19:33:50.692 2014] Starting kernel … [Sat Apr 12 19:33:50.692 2014] [Sat Apr 12 19:33:51.298 2014] Booting Linux on physical CPU 0x0 第一行告诉控件现在正在给内核,而第二行告诉控件现在是内核并且正在由CPU执行。 从u-boot到内核的这种切换对我们的应用程序来说花费了太多时间。 为了理解这两个事件之间发生了什么,我在下面插入了printf语句: 1- bootm.c 我把以下行放在函数static void boot_jump_linux(bootm_headers_t *images, int flag) } if (!fake) {printf(“above kernel_entry in boot_jump_linux in bootm.c\n”); kernel_entry(0, machid, r2); […]

time.h和linux / time.h之间的声明冲突阻止我使用CLOCK_TAI

我想用 #include clock_gettime(CLOCK_TAI, &…); 但不幸的是CLOCK_TAI没有在库存time.h头文件中定义(至少在openSUSE 13.2中)。 但是它在linux / time.h中定义,实际上是由操作系统支持的。 但是如果我包含后一个标题,它会引发一堆声明冲突 – 与time.h和bits / types.h相比 。 仅包括linux / time.h没有帮助,因为time.h和/或bits / types.h将被unistd.h或stdlib.h隐含地包含在公共头文件中。 所以我尝试手动解决冲突。 特别是,第一个编译器错误消息是关于timespec重新声明,所以我在我的代码中写道: #include #if defined(__timespec_defined) && !defined(_STRUCT_TIMESPEC) #define _STRUCT_TIMESPEC #endif #include 它起作用,但不是没有与itimerspec重新声明的另一个冲突,它在两个标题中都是无条件宣布的,并没有与任何包含守卫的定义结束。 所以我决定完全禁止隐含的time.h包含: #include #ifndef _TIME_H #define _TIME_H #endif 这继续与编译器抱怨时间重新声明。 所以我也禁止了隐含的bits / types.h包含: #include #ifndef _TIME_H #define _TIME_H #endif #ifndef _BITS_TYPES_H #define _BITS_TYPES_H #endif 好吧,但这也删除了重要的基本声明,其中像size_t这样的常见类型是基于的。 […]

linux ARP recvfrom信息

如果我发送ARP包,我可以从recv中找出发送者的IP地址是什么吗?我问这个是因为我将多个包发送到具有子进程的不同主机,并且我收到对所有子进程的响应所以我问如果有办法知道孩子送什么包裹。谢谢。 struct ether_arp req; struct sockaddr_ll addr={0}; struct ifreq inter; int sock;//I check usinginter if the interface is correct sock=socket(AF_PACKET,SOCK_DGRAM,htons(ETH_P_ARP)); if (sock==-1) { printf(“%s”,strerror(errno)); } if (ioctl(sock,SIOCGIFINDEX,&inter)==-1) { printf(“%s”,strerror(errno)); return ;//for the interface index addr.sll_family=AF_PACKET; addr.sll_ifindex=index; addr.sll_halen=ETHER_ADDR_LEN; addr.sll_protocol=htons(ETH_P_ARP); memcpy(addr.sll_addr,ether_broadcast_addr,ETHER_ADDR_LEN); req.arp_hrd=htons(ARPHRD_ETHER); req.arp_pro=htons(ETH_P_IP); req.arp_hln=ETHER_ADDR_LEN; req.arp_pln=sizeof(in_addr_t); req.arp_op=htons(ARPOP_REQUEST); …………………. memcpy(&req.arp_spa,&target_ip_addr.s_addr,sizeof(req.arp_spa));//this way I save the source IP ……. if (sendto(sock,&req,sizeof(req),0,(struct […]

我是否可以通过一个进程中的PTE指示物理内存碎片在其他进程中创建适当的PTE?

当我们在Linux中使用函数mmap (,,, MAP_ANON | MAP_SHARED); 然后,对于进程之间的碎片物理内存(分配)的相同区域,分配虚拟内存页(PTE)。 即这些PTE从一个进程的页表复制到另一个进程的页表(具有相同的物理地址分配内存片段序列),这是真的吗? 但是mmap ()需要在fork ()之前完成。 如果我们已经有两个工作进程(即fork () ),那么我们需要为mmap()使用一个文件 。 哪两个函数用于复制两个已经建立的进程之间的PTE机制来创建共享内存? 我可以使用PTE / SGL(分散 – 收集列表)指示已经分配的物理内存片段,通过使用linux-kernel在其他进程中创建适当的PTE,以及如何做到这一点? 我想了解mmap()在较低级别的工作原理。

是什么导致Linux中的系统调用以提升的权限运行

在linux中,可以为实用程序分配特定的用户/组,从而限制对它们的访问。 我明白了,但linux如何在系统调用级别应用权限。 例如,如果我尝试通过pthread_setschedparam更改调度策略或提高线程的优先级,则调用将失败,除非我以root身份运行我的进程。 所以我的问题是linux中的哪个组件负责将权限应用于系统调用? 如果我理解负责系统调用级别权限的组件,那么我可以请求系统管理员授予我的用户访问某些系统调用的权限。 也许权限不是系统调用,而是某些操作,例如更改线程优先级。 我需要告诉系统管理员,以便他可以选择性地访问此类操作?

帮助简单的linux shell实现

我在c中实现了一个简单版本的linux shell。 我已经成功编写了解析器,但是我在解决子进程时遇到了一些麻烦。 但是,我认为这个问题是由于数组,指针等引起的,因为刚刚用这个项目启动了C,并且我对它们仍然不是很了解。 我收到了分段错误,不知道从哪里来。 任何帮助是极大的赞赏。 #include #include #include #include #include #include #define MAX_COMMAND_LENGTH 250 #define MAX_ARG_LENGTH 250 typedef enum {false, true} bool; typedef struct { char **arg; char *infile; char *outfile; int background; } Command_Info; int parse_cmd(char *cmd_line, Command_Info *cmd_info) { char *arg; char *args[MAX_ARG_LENGTH]; int i = 0; arg = strtok(cmd_line, ” “); […]

opendir:打开的文件太多了

我写这段代码打印/home/keep with absolution path中的所有文件: #include #include #include #include #include #include #include void catDIR(const char *re_path); int main(int argc, char *argv[]) { char *top_path = “/home/keep”; catDIR(top_path); return 0; } void catDIR(const char *re_path) { DIR *dp; struct stat file_info; struct dirent *entry; if ((dp = opendir(re_path)) == NULL) { perror(“opendir”); return; } while (entry = […]

“选项已启用”和“已通过选项”usind gcc -Q -v之间有什么区别

我正在寻找编译期间使用的默认编译器标志。 因此我使用命令gcc -Q -v 感兴趣的输出如下所示: GNU C(Ubuntu 4.8.4-2ubuntu1~14.04.3)版本4.8.4(x86_64-linux-gnu)由GNU C版本4.8.4编译,GMP版本5.1.3,MPFR版本3.1.2-p3,MPC版本1.0.1 GGC启发式: – param ggc-min-expand = 100 –param ggc-min-heapsize = 131072 传递的选项:-v -imultiarch x86_64-linux-gnu example.c -mtune = generic -march = x86-64 -fstack-protector -Wformat -Wformat-security 启用选项:-faggressive-loop-optimizations -fasynchronous-unwind-tables -fauto-inc-dec -fbranch-count-reg -fcommon -fdelete-null-pointer-checks -fdwarf2-cfi-asm -fearly-inlining -feiminate- unused-debug-types -ffunction-cse -fgcse-lm -fgnu-runtime -fgnu-unique -fident -finline-atomics -fira-hoist-pressure -fira-share-save-slots -fira-share-spill-slots – fivopts -fkeep-static-consts -fleading-underscore […]