Tag: posix

atoi是一个标准function。 但是itoa不是。 为什么?

为什么这个区别? 我已经遇到了可怕的问题,假设itoa在stdlib.h ,最后将itoa的自定义版本与不同的原型相关联,从而产生一些疯狂的错误。 那么,为什么itoa不是标准function呢? 它出什么问题了? 为什么标准偏向其孪生兄弟atoi ?

相当于MSVC的open_memstream

我在我的库中使用open_memstream ,但我想将此库移植到MSVC。 似乎没有可用的等效function,但有足够类似的function吗? open_memstream所做的是它需要一个char **目的地和大小并返回你很多写入的FILE *,数据存储在一个动态分配的缓冲区中(可以从char **参数访问)。 关闭FILE时,char **包含写入流的数据。 这使得构建大型复杂字符串流变得简单。 虽然可以从memstream读取和搜索,但我只能写入它。 有没有办法在MSVC中打开类似的内存FILE流? 此外,这是纯C,没有C ++。

如何使用Posix上的C创建具有权限的目录

我正在尝试编写一个创建目录的简单C程序(mkdir clone。)。 这是我到目前为止: #include #include // mkdir #include // perror mode_t getumask() { mode_t mask = umask(0); umask (mask); return mask; } int main(int argc, const char *argv[]) { mode_t mask = getumask(); printf(“%i”,mask); if (mkdir(“trial”,mask) == -1) { perror(argv[0]); exit(EXIT_FAILURE); } return 0; } 这段代码用d———创建目录但是我希望用drwxr-xr-x像mkdir那样创建它吗? 我在这做错了什么? 编辑:这是我的工作解决方案: int main(int argc, const char *argv[]) { […]

在C中编译/匹配POSIX正则表达式

我正在尝试匹配字符串pcode中的以下项目: u后面跟着一个或两位数字 phaseu phasep x (由非单词字符包围) y (由非单词字符包围) z (由非单词字符包围) 我尝试使用POSIX正则表达式函数实现正则表达式匹配(如下所示),但有两个问题: 编译后的模式似乎没有子模式(即compiled.n_sub == 0)。 该模式在字符串“u0”中找不到匹配项,它确实应该! 我确信正则表达式字符串本身正在工作 – 它在python和TextMate中工作 – 我的问题在于C语言中的编译等。任何帮助实现这一点都将非常感激。 提前感谢您的回答。 if(idata=tb_find(deftb,pdata)){ MESSAGE(“Global variable!\n”); char pattern[80] = “((u[0-9]{1,2})|(phaseu)|(phasep)|[\\W]+([xyz])[\\W]+)”; MESSAGE(“Pattern = \”%s\”\n”,pattern); regex_t compiled; if(regcomp(&compiled, pattern, 0) == 0){ MESSAGE(“Compiled regular expression \”%s\”.\n”, pattern); } int nsub = compiled.re_nsub; MESSAGE(“nsub = %d.\n”,nsub); regmatch_t matchptr[nsub]; int err; […]

如何在不违反严格别名规则的情况下合法地使用类型惩罚与联合在struct sockaddr的变体之间进行投射?

POSIX打算将struct sockaddr变量指针转换为可转换的,但是根据C标准的解释,这可能违反了严格的别名规则,因此违反了UB。 (请参阅下面的评论这个答案 。)我至少可以确认gcc可能至少存在问题:此代码打印Bug! 启用优化,并且Yay! 禁用优化: #include #include #include sa_family_t test(struct sockaddr *a, struct sockaddr_in *b) { a->sa_family = AF_UNSPEC; b->sin_family = AF_INET; return a->sa_family; // AF_INET please! } int main(void) { struct sockaddr addr; sa_family_t x = test(&addr, (struct sockaddr_in*)&addr); if(x == AF_INET) printf(“Yay!\n”); else if(x == AF_UNSPEC) printf(“Bug!\n”); return 0; } 在联机IDE上观察此行为。 要解决此问题, […]

便携式捕获信号并向用户报告问题的方法

如果由于某些奇迹在我们的程序中发生了段错误,我想要捕获SIGSEGV并让用户(可能是GUI客户端)知道一个返回码,发生了严重的问题。 同时我想在命令行上显示信息以显示捕获的信号。 今天我们的信号处理程序如下所示: void catchSignal (int reason) { std :: cerr << "Caught a signal: " << reason << std::endl; exit (1); } 我可以听到上面的恐怖尖叫,正如我从这个post中读到的那样,从信号处理程序调用非重入函数是邪恶的。 是否有便携式方式处理信号并向用户提供信息? 编辑:或至少在POSIX框架内可移植?

如何从select()的fd_set结果中仅循环活动文件描述符?

所以在我目前的服务器实现中,它目前是这样的: void loop(){ // step 1: clear set fd_set readfds; while(true){ // step 1: FD_ZERO(readfds); // step 2: loop_through_sockets_and_add_active_sockets_to(theset); // step 3: switch(select(FD_SETSIZE, &readfds, 0, 0, &tv)) { case SOCKET_ERROR: patia->receiveEvent(Error, net::getError()); return; case 0: return; } // step 4: loop through sockets and check, using FD_ISSET, which read fd’s have incoming data. } } […]

如何将Ctrl-C控制字符或终端挂断消息发送到子进程?

我有一个在伪终端中运行的子进程。 父进程不以root身份运行,但子进程通过su或sudo运行。 因此,无法向子进程发送信号以强制它退出。 我想通过以下方法之一强制退出: 模拟Ctrl-C。 模拟终端挂断。 我该怎么做? 我已经有一个pty master fd,我尝试过这样的事情: write(master, &termios.c_cc[VINTR], 1) 但它没有做任何事情。

MAP_ANONYMOUS符合C99标准

我有一个使用mmap系统调用的应用程序,我有一个问题,让它编译几个小时,看看为什么我得到MAP_ANON和MAP_ANONYMOUS未声明,我有一小部分代码,我用过,我看到我可以编译它就好了,所以我尝试了一个基本的编译,这工作,我看到它添加-std = c99失败。 是否有特定原因导致MAP_ANON和MAP_ANONYMOUS在C99标准中无效? 我知道它们不是由POSIX定义的,而是由BSD SOURCE定义的,所以我只想知道为什么会这样。

POSIX线程被“暂停”是什么意思?

在对最近一个问题的评论过程中,出现了一个附属问题,即在什么时候可以预期对具有可取消性PTHREAD_CANCEL_DEFERRED的pthreads线程的取消请求起作用。 随后提到了标准和一些律师。 我并不太关心我在这个问题的评论中是否错了,但我想确保我正确理解POSIX的规定。 标准中最相关的部分说 每当线程启用了可取消性并且已经以该线程作为目标取消请求,然后线程调用任何作为取消点的函数时,取消请求将在函数返回之前被执行。 如果线程启用了可取消性并且在线程作为目标进行了取消请求,而线程在取消点处被挂起,则线程应被唤醒并且取消请求将被执行。 但是,线程被“暂停”是什么意思呢? POSIX明确定义了进程的术语,但就我而言,并没有为线程定义。 另一方面,POSIX将线程暂停作为少数函数的行为之一,包括但不限于与同步对象相关的一些函数。 是否应该得出结论认为那些集体作为该术语的相关定义? 鉴于POSIX没有将线程暂停指定为read() , fread()或任何常规文件或流I / O函数的行为的一部分,因此这一切都与产生此查询行的问题有关,如果一个post因I / O被阻止而没有进展,这是否意味着它被“暂停”以便取消?