Articles of posix

有什么办法可以不先读取几个字节的磁盘扇区?

我一直在尝试在Linux上读写文件的性能,尤其是O_DIRECT,我想知道,在硬盘级别和posix / Linux API级别,是否可以只写几个字节到而不会破坏其他部门,而不会先阅读它?

在通过curl获取的两个文件之间添加一个新行

我有这个命令获取2个文件,执行一些格式化并输出结果。 curl https://www.cloudflare.com/ips-v{4,6} | sed 's/^/set_real_ip_from /;s/$/\;/' \ > /home/user/output.txt 它工作得很好,问题是如何添加文件1和文件2之间的换行符(保留对格式的更改)?

可以dup2真的返回EINTR?

在规范和两个实现中: 根据POSIX, dup2()可能会返回EINTR。 Linux的手册页列出了允许的。 FreeBSD手册页表明它从未返回。 这是一个错误 – 因为它的紧密实现可以EINTR(至less为TCP徘徊,如果没有别的)。 事实上,Linux可以返回EINTR为dup2() ? 大概如果是这样,这将是因为close()决定等待,并且一个信号到达(TCPclosures或试图在closures时同步的文件系统驱动程序)。 实际上,FreeBSD是否保证不返回EINTR for dup2() ? 在这种情况下,它一定是不用等待旧fd上的任何未完成的操作,而只是将fd解除链接。 POSIX dup2()在引用“closing”(而不是斜体)而不是引用实际的close()函数时意味着什么?我们理解它只是以非正式的方式来“closures”它(取消链接文件描述符),还是试图说效果应该像close()函数首先被调用,然后dup2()被自动调用。 如果fildes2已经是一个有效的开放文件描述符,则它应该先closures,除非fildes等于fildes2,在这种情况下dup2()应该返回fildes2而不closures它。 如果dup2()不得不closures,等待,然后primefacesdup,这将是一个执行者的噩梦! 这比EINTR差很多close()失败)。 懦弱的POSIX甚至不会说在EINTR的情况下是否发生了dup …

从NTP服务器传递时间信息到strftime函数

我通过引用这里的网页在底部使用代码ntp客户端代码。 代码接收时间信息,然后我想存储的时间信息为YYYYMMDDHHMM像201304211405 。 代码接收来自NTP服务器的时间信息,但是我发现如何将该信息传递给strftime ,我该如何将收到的时间信息传递给strftime ? 这是代码的相关部分 i=recv(s,buf,sizeof(buf),0); tmit=ntohl((time_t)buf[10]); //# get transmit time tmit-= 2208988800U; printf("tmit=%d\n",tmit); //#compare to system time printf("Time is time: %s",ctime(&tmit)); char buffer[13]; struct tm * timeinfo; timeinfo = ctime(&tmit); strftime (buffer,13,"%04Y%02m%02d%02k%02M",timeinfo); printf("new buffer:%s\n" ,buffer); 这里是我正在使用的完整代码 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> void ntpdate(); int main() […]

MessageQueue名称和消息队列大小

我还有两个问题。 1.如何将消息队列名称作为命令行parameter passing? 比如我写道: char src[50] , dest[50]; strcpy(src , "/"); strcpy(dest , argv[1]); // argv[1] is the name of message queue strcat(dest , src); char *msgqueue; strcpy(msgqueue , dest); 但是,它给出了分段错误,当我改变为char msgqueue [50],没有有效的错误出现。 我如何能够达到消息队列中的元素数目? 我试过m_attr.mq_msgsize,但是我发现它没有给出答案。 我需要你的帮助,他们是完成作业的最后一步! 感谢你所做的一切!

在linux(或POSIX)函数中类似于win32的mem api

我在Windows上编写解释型语言,我使用HeapCreate来实现堆栈和HeapCreate / HeapAllocdynamic分配我的语言。 也许我需要将我的语言移植到其他操作系统..所以,在Linux(或POSIX标准..),有什么类似于这些win32 api? (我希望他们没有很大的不同..) 好的,如果你不知道这些win32 API,请看下面的内容: HeapCreate – 简单。 创build一个新的堆: void *mem = malloc(123); // alloc from default heap HANDLE hHeap = HeapCreate(…); // create a new heap void *mem2 = HeapAlloc(hHeap, some_flag, 123); // alloc from new heap PAGE_GUARD – 有点复杂; 它被用来实现堆栈。 例如,有一个堆栈,其最大大小为5页。 为了节省内存,我只分配一个页面,只是“保留”4个页面的虚拟内存地址。 ——— | alloc | ——— |reserve| ——— |reserve| […]

Windows线程的移植在Android OS上运行

这是我面临的一个非常严重的危机。 我有一个为Windows和Windowsdevise的应用程序线程在我的代码中使用。 这是我想要将我的应用程序移植到Android的scenerio,我知道Windows线程不能在Android操作系统上运行。 任何机构可以告诉我如何改变我的线程,以支持Android。 在P线程中重写线程是不错的select,但有没有简单的方法来支持现有的Windows线程在Android上的multithreading。 在Windows和Linux上进行线程处理 我介绍了上面的链接,它讲述了使用boost::thread.在Linux和Windows中进行boost::thread. 但问题是在lib是在C++和我的代码是在C 期待您的input,轻松过渡到我的android应用程序的Windows线程线程。 提前致谢

使用pthread_join()

我想知道,如果我们做一个没有pthread_join的pthread_create ,会发生什么? 谁将“清理”“未join”线程的所有内存。

什么/ proc / fd文件描述符显示?

今天学习了/proc/目录,特别是我对半所有关于一个进程的信息的安全意义感兴趣,于是我写了一个简单的程序,做了一些简单的程序,它使我能够探索一些属性/proc/目录下: #include <iostream> #include <unistd.h> #include <fcntl.h> using namespace std; extern char** environ; void is_linux() { #ifdef __linux cout << "this is running on linux" << endl; #endif } int main(int argc, char* argv[]) { is_linux(); cout << "hello world" << endl; int fd = open("afile.txt", O_RDONLY | O_CREAT, 0600); cout << "afile.txt open on: […]

与setpgid竞争条件

在为我的OS课程开发一个程序的时候,我发现了一个有趣的例子,涉及到一个看起来像setpgid的竞争条件。 分别编译下面的每个程序。 执行./test 3 (或任意数字> 2)之后, ps jx将显示所有的infy进程已经放在同一个组中。 ./test 2将显示setpgid尝试移动最后一个进程失败的错误。 取消注释“修复我”行将导致./test 2按预期工作。 任何人都可以提供解释或解决scheme? // test.c #include <unistd.h> #include <stdio.h> #include <stdlib.h> char* args[] = { "./infy", NULL }; int main(int argc, char* argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s [num]\n", argv[0]); return 1; } int num = strtol(argv[1], NULL, 10); if (num […]