Articles of posix

这两个函数有什么区别:`ioremap_uc()`和`set_memory_uc`?

当我想将内存区域标记为Write Combined(禁用可caching和使用BIU)或者通过设置PAT(页面属性表 – PIT中的7bit)不可caching时,那么我必须使用什么,以及这两个函数之间有什么区别? 驱动程序应该使用ioremap_[uc|wc]访问具有[uc | wc]访问types的PCI BAR: void __iomem * ioremap_wc(resource_size_t phys_addr,unsigned long size) 驱动程序应该使用set_memory_[uc|wc]设置RAM范围的访问types: int set_memory_uc(unsigned long addr,int numpages) 取自: http : //lwn.net/Articles/278994/ 为什么我不能使用PCI BAR和RAM范围的单一function? 说明: ioremap_uc()获取物理地址和返回虚拟地址设置不可caching,与set_memory_uc()获得虚拟地址,并设置这些页面的Uncacheable? 这些代码是否相同? void* virt_ptr = ioremap_uc(phys_ptr, size); 和 void* virt_ptr = ioremap(phys_ptr, size); const int page_size = 4096; set_memory_uc(virt_ptr, size/page_size);

在传递NULL的情况下转储核心

strdup(null)转储核心。 尝试在Ubuntu和FreeBSD的两个。 为什么? 它不应该返回null吗? char *b = NULL; a = strdup(b); 这将会在strdup调用中转储核心。

POSIX:FreeBSD vs Linux中的pipe道系统调用

在Linux(2.6.35-22-generic)中, man pipe指出 pipe()创build一个pipe道,一个可用于进程间通信的单向数据通道。“ 在FreeBSD(6.3-RELEASE-p5)中, man pipe指出 pipe()系统调用创build一个pipe道,这是一个允许双向数据stream的对象,并分配一对文件描述符。 一个是单向的,另一个是双向的。 我希望这不是一个愚蠢的问题,但哪种方法是这样做的标准方式? 他们都符合POSIX? 为了使我的意图清楚,我相信pipe()是一种方法,并且正在寻找一些弹药以获得任何点数,因此在考试中丢失了一些分数; p

在mq_send中发送结构体

我使用的是POSIX IPC,根据文档 – http://man7.org/linux/man-pages/man3/mq_send.3.html mq_send()方法只发送char *数据,而mq_recv()只接收字符数据。 但是,我想发送一个自定义结构到我的消息队列,并在接收端,我想要的结构。 示例结构: struc Req { pid_t pid; char data[4096]; } 那么,有没有人知道如何在C lang中做到这一点?

如何在Python的Linux设备文件上执行低级I / O?

我有一个设备返回一个string来响应写入设备文件的命令。 我能够写入命令到设备,并读取C中的返回string,代码如下所示: int dev = open("/dev/USBDev251",O_RDWR); write(dev,data,sizeof(data)); read(dev,buff,16); 试图在python中做同样的事情: dev = os.open("/dev/USBDev251",os.O_RDWR) os.write(dev, data) os.read(dev,16) 写入成功,但只返回一个空string。 我在这里错过了什么?

执行命令行并返回命令输出

目前,我正在使用非标准SYSTEM内部例程(类似于Fortran 2008 EXECUTE_COMMAND_LINE内部函数)从我的fortran程序中使用shell命令行调用: CALL SYSTEM(commandStr) 其中commandStr是包含我要执行的shell命令的string。 此刻,我不知道直接的方式来返回commandStr的输出,但只有它的返回状态。 所以,我现在正在做的是将输出写入文件,然后从Fortran程序中读取文件。 例: CALL SYSTEM('sed ''s/,//g'' myFile > dummyFile') 如果我想从myFile中删除逗号。 然后我使用OPEN和READ来获取dummyFile的内容。 这工作得很好,但是我很关心从磁盘写入/读取文件,特别是如果我在一个长的循环内执行此操作,并且commandStr输出很大。 有没有办法将commandStr输出redirect到我可以直接从Fortran程序访问的内存缓冲区(而不是硬盘)(也许是通过一个特定的UNIT号码)?

如何使用settimeofday(2)?

我在这里做错了什么? 我期望settimeofday()来更改系统时间,而不是返回EINVAL 。 $ uname -a Linux io 4.3.5-300.fc23.x86_64 #1 SMP Mon Feb 1 03:18:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux $ cat settimeofday.c #include <sys/time.h> #include <stdio.h> int main() { struct timeval tv = {0, 0}; if (settimeofday(&tv, 0) == -1) perror("settimeofday"); } $ gcc settimeofday.c $ sudo ./a.out settimeofday: Invalid argument 错误来自运行Fedora 23的Thinkpad […]

将一个数组结构初始化为共享内存

我正在创build4个程序,创build一个POSIX共享内存对象,这是一个结构数组,将由其他3个进程共享。 基本上这个项目模拟文件。 程序#1创build该对象。 程序#2将文件名和string作为参数,然后将文件名和string(文件内容)作为一个结构保存到共享内存中,该结构放入数组的可用元素中。 程序#3将列出文件名。 程序#4将search给定的文件并显示其内容。 我遇到的麻烦是初始化一个结构数组到共享内存。 我不断收到以下错误,告诉我我正在使用不正确的方法初始化指针: myformat.c:36: warning: initialization from incompatible pointer type 我已经search了这个主题,发现了一些类似的问题,但没有真正相关的问题。 那么,如何正确地将一个结构数组初始化为共享内存呢? 基于我的研究,我编码如下。 谢谢! PROGRAM#1(myformat.c): #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/shm.h> #include <sys/stat.h> struct MyFiles { char *fileName; char *fileContents; }; int main() { /* the size of shared memory object */ int size = sizeof(struct […]

将subprocess的stdin和stdoutredirect到pipe道

编辑:解决scheme是 int c1=dup2(pipes[0][1],STDOUT_FILENO); int c2=dup2(pipes[1][0],STDIN_FILENO); setvbuf(stdout,NULL,_IONBF,0); SETVBUF将stdout设置为非缓冲。 即使我正在打印换行符,如果目标不是一个实际的屏幕,我想,它变得缓冲。 编辑:当我把fflush(标准输出)后LINE 1和fflush(fout) LINE 4后,它按预期工作。 但是,如果没有第一行之后的fflush(stdout) ,它就不能工作。问题是我不能将fflush放到我计划运行的程序中。 我正在尝试从我的过程开始另一个程序。 我没有访问它的代码,但我知道它使用标准input和标准输出用户交互。 我试图通过创build2个pipe道来启动该程序,将subprocess的stdin / stdout分叉并redirect到适当的pipe道末端。 要点是,父应该能够通过文件描述符与孩子通信,而其标准input/标准输出应该是完整的。 POPEN系统调用只打开单向pipe道。 下面的代码几乎可以工作。 有4行标记为LINE 1..4。 LINE 1是发送到pipe道的subprocess,LINE 2是从pipe道接收的subprocess,LINE 3是向pipe道发送的父进程,LINE 4是从pipe道接收的父进程, 这只是一个玩具的例子,以确保事情的工作。 问题是,所有4行LINE1..4都是未注释的输出,我看到在terminal上 PARENT1: -1 FD: 1 0 4 5 0 1 DEBUG1: 0 DEBUG2: 0 而如果LINE 1和LINE 3没有注释,我只能看到连续的数据stream。 如果只有LINE 2和LINE 4未注释,则会发生同样的情况。 但是,我想要一个完整的双向通信。 同时添加注释的SLEEP不会改变行为。 这里可能是什么问题。 我想知道为什么没有双向POPEN。 int […]

是否有任何通过fstat()检查文件是否是符号链接的POSIX方式?

有没有通过fstat(2) POSIX的方式来检查文件是否是一个符号链接? open(2)有标志O_NOFOLLOW可以检查,但是不是POSIX。 在fstat(2)有S_ISLNK ,这在man fstat说: The S_ISLNK() and S_ISSOCK() macros are not in POSIX.1-1996, but both are present in POSIX.1-2001; the former is from SVID 4, the latter from SUSv2. 编译将在我的机器上失败。 另外,在lstat(2)还有另外一个S_IFLNK ,但是它不能和fstat(2) (它将跟随所指向的文件的链接)。