Tag: linux

使用fifo以非阻塞模式打开并选择

我有两个进程A和B.通信流总是A – > B,但我需要使用命名管道来做,因为我必须在B进程内的select调用中使用管道文件描述符,并写入数据当任何或两个进程退出时,管道必须保持不变。 管道两端以非阻塞模式打开。 在过程A: int push_fifo_fd = open(FIFO_NAME, O_WRONLY | O_NONBLOCK | O_CREAT, 0644); 在流程B中: int fd = open(FIFO_NAME, O_RDONLY | O_NONBLOCK | O_CREAT, 0644); Q1。 进程B使用curl多接口,因此我得到curl多句柄的fd_sets并将“fd”描述符添加到读取fd_set,而不是调用select,以获取可用于读取和写入的文件描述符。 在每次调用select中,“fd”包含在结果读取fd_set中,但read返回0,即使写入结束也是如此。 这导致进程B使用100%的处理器时间。 我提到我不知道订购哪个管子的末端是打开的。 B的相关代码: while (1) { fd_set read_fds, write_fds, err_fds; FD_ZERO(&read_fds); FD_ZERO(&write_fds); FD_ZERO(&err_fds); FD_SET(fifo_fd, &read_fds); // some code ccode = curl_multi_fdset(curlm, &read_fds, &write_fds, &err_fds, &max_fd); […]

可以在Linux上的用户空间中实现本机代码的抢占式多任务处理吗?

我想知道是否有可能在Linux上的用户空间中的单个进程内实现本机代码的抢占式多任务处理。 (也就是说,从外部暂停一些正在运行的本机代码,保存上下文,在不同的上下文中交换,以及恢复执行,所有这些都由用户空间协调,但使用可能进入内核的调用。)我以为这可以使用信号来完成SIGALRM处理程序和*context()系列但事实certificate整个*context()系列是异步信号不安全的,因此无法保证方法有效。 我确实找到了实现这个想法的要点 ,所以显然它确实在Linux上运行,至少有时候,即使POSIX也不需要工作。 gist将其安装为SIGALRM上的信号处理程序,它会进行多次*context()调用: void timer_interrupt(int j, siginfo_t *si, void *old_context) { /* Create new scheduler context */ getcontext(&signal_context); signal_context.uc_stack.ss_sp = signal_stack; signal_context.uc_stack.ss_size = STACKSIZE; signal_context.uc_stack.ss_flags = 0; sigemptyset(&signal_context.uc_sigmask); makecontext(&signal_context, scheduler, 1); /* save running thread, jump to scheduler */ swapcontext(cur_context,&signal_context); } Linux是否提供任何使此方法正确的保证? 有没有办法让这个正确? 是否有完全不同的方法正确地做到这一点? (通过“在用户空间中实现”我并不是说我们永远不会进入内核。我的意思是与内核实现的抢先式多任务进行对比。)

msgget()和mq_open之间的区别

我阅读了有关消息队列操作,如msgget(),msgsnd()和msgrcv()。 但是当我在堆栈溢出中搜索与消息队列相关的问题时,我才知道还有另一组消息队列操作,例如mq_open(),mq_send(),mq_receive()。 任何人都可以告诉我这两种类型的消息队列之间有什么区别,以及广泛使用哪种类型的消息队列?

哪些组件使用区域设置变量?

我已经读过每个进程都有一组与之关联的语言环境变量。 例如,这些是与我的系统上的bash进程关联的语言环境变量: $ locale LANG=”en_GB.UTF-8″ LC_COLLATE=”en_GB.UTF-8″ LC_CTYPE=”en_GB.UTF-8″ LC_MESSAGES=”en_GB.UTF-8″ LC_MONETARY=”en_GB.UTF-8″ LC_NUMERIC=”en_GB.UTF-8″ LC_TIME=”en_GB.UTF-8″ LC_ALL= 我想知道谁实际使用这些语言环境变量。 C标准函数(例如: fwrite() )和Linux系统调用是否使用它们? 某些C标准函数或某些Linux系统调用的行为是否因某些语言环境变量的值而异? 或者只是某些程序可以使用这些区域设置变量? 例如,我可以编写一个程序,根据LANG语言环境变量的值,以不同的语言向用户显示消息。

makefile混淆中的链接器库路径

我已经编程了一段时间,但我仍然不完全理解链接器的行为方式。 例如,今天我下载并安装了一个我想在Linux应用程序中使用的库。 (这是Xerces – 用于解析XML文件)。 我创建了一个makefile,并在其命令中为它提供了.so和.a文件的路径:-L / usr / local / lib,并且还告诉它要包含的库的名称:-lxerces-c-3.1。 我的应用程序编译正常但在运行时失败“无法打开共享对象文件libxerces-c-3.1.so”。 当我在makefile中正确地给出路径和名称时,为什么会出现这种情况? 然后我将库路径添加到我的.bashrc文件中的LD_LIBRARY_PATH变量,然后它工作。 这很好,但如果我现在删除我的makefile中的库的路径,甚至不包括库的名称,它仍然有效。 我很困惑这里发生了什么。 如何通过分配LD_LIBRARY_PATH变量的路径仍然可以找到正确的库,并且只有在我这样做的情况下才能工作? 我在别处读过甚至不使用LD_LIBRARY_PATH。 我很感激任何答案。 问题有点长,希望不是偏离主题,但我希望其他人也可以从中学习。 谢谢

等待信号,然后继续执行

我正在尝试制作一个暂停执行的程序, 直到信号到达 。 然后,在信号到达后,我只想让我的代码从原来的位置继续执行 。 我不希望它执行函数处理程序或任何其他。 有一个简单的方法吗? 我已经挣扎了一个星期左右,在这里和那里阅读,并没有设法得到一个完整的操作代码。 特别是,我希望主程序创建一个等待某个特定事件发生的线程 (例如,用户已经向stdin输入了一些数据)。 与此同时,主程序正在做一些事情,但在某些时候它会暂停执行,直到收到信号。 信号可能来自线程,因为它已检测到事件,或者可能是由于超时,因为我不希望它等待。 我已经制作了一些代码,但它没有按预期工作…… /* * This code SHOULD start a thread that gets messages from stdin. * If the message is a “quit”, the thread exits. Otherwise it raises * a signal that should be caught by the main program. * The main program simply […]

挂钩框架(类似绕行)

我正在寻找一个C库/框架,它允许我替换内存中的函数并将它们重定向到我自己的实现,同时仍允许我的实现调用原始实现。 这似乎是Linux-y系统中相当罕见的需求,大概是因为LD_PRELOAD涵盖了运行时function替换的大多数方面。

`select`来自多个线程的同一个fd

如果我从多个线程调用相同的打开文件描述符,会发生什么? 这是在某处记录的吗?

如何在程序中获取_GLOBAL_OFFSET_TABLE_地址?

我想在我的程序中获取_GLOBAL_OFFSET_TABLE_的地址。 一种方法是在Linux中使用nm命令,可能将输出重定向到文件并解析该文件以获取_GLOBAL_OFFSET_TABLE_的地址。 但是,这种方法似乎效率很低。 有哪些更有效的方法呢?

获取内核中当前运行程序的绝对路径

为了检索正在运行的程序的文件权限,我需要在当前运行的程序上执行kstat 。 然后我需要获取加载的ELF图像的绝对路径。 那可能吗? current->comm仅记录没有路径的程序名称。 或者其他什么方法呢?