偶尔(例如使用strace,gdb等等)人们会发现一个POSIX调用集errno是一个整数值,而一个人想知道编译时间C常数(更准确地是由预处理器定义)来检查它(例如ECHILD)-参见例如等待子进程的pid没有成功。
上面链接的问题中的EG,在10中返回了整数错误号errno。我想从那儿回到琴弦上ECHILD。不给我什么perror或strerror给我什么(“没有子进程”或类似的东西)。
这是这样做的明显方法,该方法不起作用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main (int argc, char **argv)
{
printf ("%s\n", strerror (10));
exit (0);
}
Run Code Online (Sandbox Code Playgroud)
打印输出:
No child processes
Run Code Online (Sandbox Code Playgroud)
不是ECHILD,因此不执行所需的操作。
有什么比手动grep完成更简单的方法/usr/include吗?
您可能认为重复的事物,但并非如此:
如何将UNIX中的errno转换为相应的字符串?-说strerror(很明显)将整数转换为人类可读的字符串,并perror打印出来。我不想那样做。我想打印符号等效项,即可以用来测试的预处理器定义errno。
Linux,将errno转换为name-更接近,但正在寻找API调用。显然,其中没有一个。接受的答案还错误地指出了错误所在errno.h-在我的系统中,错误分散在多个文件之间,使搜索更有趣。如何在C中打印errno的符号名称?类似。
适当的答案可能涉及一些魔术,以预处理的适当部分/usr/include并显示E以适当值开头的任何常数。
我是golang的新手,我正在尝试用最好的方式来解决这个问题.
我有一系列我静态定义和传递的路由gorilla/mux.我正在使用某些东西处理每个处理函数来处理请求和处理恐慌(主要是因为我可以理解包装是如何工作的).
我希望他们每个人都能够访问"上下文" - 一个每个http服务器一个结构,可能有数据库句柄,配置等等.我不想做的是使用静态全局变量.
我目前正在做的方式我可以给包装器访问上下文结构,但是我看不出如何将它放到实际的处理程序中,因为它希望它是一个http.HandlerFunc.我认为我能做的就是转换http.HandlerFunc成我自己的一种类型的接收器Context(并且对包装器做同样的事情,但是(经过多次玩)我无法Handler()接受这个.
我不禁想到我在这里遗漏了一些明显的东西.代码如下.
package main
import (
"fmt"
"github.com/gorilla/mux"
"html"
"log"
"net/http"
"time"
)
type Route struct {
Name string
Method string
Pattern string
HandlerFunc http.HandlerFunc
}
type Context struct {
route *Route
// imagine other stuff here, like database handles, config etc.
}
type Routes []Route
var routes = Routes{
Route{
"Index",
"GET",
"/",
index,
},
// imagine lots more routes here
}
func wrapLogger(inner …Run Code Online (Sandbox Code Playgroud) 我挖了旧代码,看到了这样的函数:
inline double mod(double x, double y)
{
return x-y*floor(x/y);
}
Run Code Online (Sandbox Code Playgroud)
是fmod其全部等同,或者已经我错过了什么?
任何人都可以提供代码来克服这个问题吗?
有效地我们如何struct inode*从文件中获取内核级别/dev/driver1?
在用户空间中给出:
int fd;
fd = open("/dev/driver1", O_RDWR | O_SYNC);
Run Code Online (Sandbox Code Playgroud)
在内核空间:
static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
struct dev_handle *handle;
handle = file->private_data;
Run Code Online (Sandbox Code Playgroud)
假设,我们不走那条路,
我们如何通过例如内核本身获得.难以编码file->private_data处理?
我会继续说这是 Linux 课程介绍的家庭作业。我不会在没有自己广泛尝试的情况下发布它,并且由于我本学期是远程学生,因此无法到校园进行辅导。我需要一些帮助来找出问题所在。
本质上,作业要求我们制作一个程序,该程序的基本功能与pwdPOSIX 中的命令相同,以显示当前目录的绝对路径。我们将与 main 一起使用三个函数。我们也不要使用该getcwd命令。我会列出他们和他们的目的
inum_to_filename: 接受三个参数(要转换的 inode 编号、指向写入名称的缓冲区的指针以及缓冲区的大小)。什么都不返回。它是为了:
filename_to_inum: 接受一个参数(achar *表示文件名)。它返回相应的 inode 编号。它是为了:
display_path: 接受一个参数(来自当前工作目录的 inode)。它什么都不返回。它是为了:
filename_to_inode。inum_to_filename来查找传递给函数的 inode 的名称。使用步骤 1 中的缓冲区来存储它。display_path显示绝对路径。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h> …Run Code Online (Sandbox Code Playgroud) 我正在创建一个返回字符串的函数.字符串的大小在运行时是已知的,所以我打算使用malloc(),但我不想free()在使用函数的返回值后让用户负责调用.
怎么能实现这一目标?如何等功能返回字符串(char *)的工作(如getcwd(),_getcwd(),GetLastError(),SDL_GetError())?
假设我有一个C程序(在Linux下运行),它操作许多数据结构,一些复杂,其中一些可以增长和缩小,但通常不会随着时间的推移而增长.观察到该程序随着时间的推移逐渐增加RSS(比可以通过内存碎片解释的更多).我想找到泄漏的东西.在valgrind这里运行是明显的建议,但是valgrind(带--leak-check=full和--show-reachables=yes)显示没有泄漏.我相信这是因为数据结构本身在退出时正确释放,但其中一个在程序的生命周期中正在增长.例如,可能有一个链接列表随着时间的推移呈线性增长,有人忘记删除列表中的资源,但退出清理正确地在退出时释放列表中的所有项目.当然,如果它们被释放,那么它们是否实际上是"泄漏"存在一个哲学问题(因此问题中的引号).
是否有任何有用的工具来检测这个?我喜欢的是能够运行valgrind并让它生成当前分配的报告,就像退出时一样,但是要在信号上发生这种情况并允许程序继续.然后,我可以查找堆栈跟踪签名对它们的分配越来越多.
我可以可靠地得到一个漂亮的大"核心"从文件gdb有generate-core-file; 有没有办法分析离线,如果我用一个方便的malloc()调试库编译malloc()?
我可以完全访问源代码,并且可以修改它,但我真的不想手动检测每个数据结构,而且我对问题的一般解决方案(如valgrind提供)感兴趣,而不是如何解决这个问题.特别的问题.
我在这里寻找类似的问题,但它们似乎都是:
如果我在Solaris下运行,我猜测答案是"使用这个方便的dtrace脚本".
我正在构建malloc使用 mmap的自定义实现。
如果用户想要分配 500 字节的内存,我调用mmap(0, 500, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0). mmap返回一个指向大小为 4096 的块的指针(如果这是页面大小)。
在我的链表中,我希望将一个块设置为 500 字节标记为已占用,并将一个块设置为 4096-500=3596 字节标记为空闲。尚不清楚,但是mmap实际分配了多少内存。我怎样才能得到这些信息?
我有两个我想要集成的库,让它们相互通信.他们每个人都听自己的输入和输出流.库1将是库2的传输层.
情况1:库1接收其输入流上的数据我想在另一个虚拟输出流上写入数据,该输出流将通过管道传输到库2上的输入流.
案例2:库2想要发送一些数据,因此它会将数据写入其输出流.这应该通过管道传输到虚拟输入流,数据将被读取并写入库1的输出流.
如何在objective-c中为这些NSStream创建管道?
提前感谢您的意见.
受此问题回答的启发,我对C11和C99标准进行了深入研究,以在指针上使用相等运算符(原始问题涉及关系运算符)。以下是§6.5.9.6中C11所说的(C99类似):
当且仅当两个都是空指针时两个指针比较相等,两个指针都是指向同一对象的指针(包括指向对象和它的开始处的子对象的指针)或函数,都是指向同一数组最后一个元素的指针对象,或者一个是指向一个数组对象末尾的指针,另一个是指向另一个数组对象的起点的指针,该数组对象恰好紧随地址空间中的第一个数组对象。94)
脚注94说(并且请注意,脚注是非规范性的):
两个对象可能在内存中相邻,这是因为它们是较大数组的相邻元素或结构的相邻成员,并且它们之间没有填充,或者是因为实现方式选择放置它们,即使它们是不相关的。如果先前的无效指针操作(例如,在数组范围之外进行访问)产生了未定义的行为,则后续的比较也将产生未定义的行为。
文本的正文和非规范性注释似乎存在冲突。如果人们认真对待案文中的“ if and only if”,那么除规定的情况外,其他情况下均不得返回均等,UB也没有余地。因此,例如此代码:
uintptr_t a = 1;
uintptr_t b = 1;
void *ap = (void *)a;
void *bp = (void *)b;
printf ("%d\n", ap <= bp); /* UB by §6.5.8.5 */
printf ("%d\n", ap < bp); /* UB by §6.5.8.5 */
printf ("%d\n", ap == bp); /* false by §6.5.9.6 ?? */
Run Code Online (Sandbox Code Playgroud)
应该打印零,因为ap和bp既不是指向同一对象或函数的指针,也不是其他列出的任何位。
在第6.5.8.5节(关系运算符)中,行为更加清晰(我强调):
比较两个指针时,结果取决于所指向对象的地址空间中的相对位置。如果两个指向对象或不完整类型的指针都指向同一个对象,或者都指向一个指向同一数组对象的最后一个元素的指针,则它们比较相等。如果所指向的对象是同一聚合对象的成员,则指向稍后声明的结构成员的指针大于指向早于结构中声明的成员的指针,指向具有较大下标值的数组元素的指针大于指向同一数组的元素的指针下标值较低。指向同一联合对象的成员的所有指针比较相等。如果表达式
P指向数组对象的元素,则表达式Q指向同一数组对象的最后一个元素,指针表达式的Q+1比较大于P。在所有其他情况下,行为是不确定的。 …