Tag: posix

Posix正则表达式非贪心

有没有办法在C中使用非贪婪的正则表达式,就像可以在Perl中使用? 我尝试过几件事,但实际上并没有用。 我目前正在使用这个与IP地址和相应的HTTP请求匹配的正则表达式,但是虽然我使用的是*?但它很贪婪 ([0-9]{1,3}(\\.[0-9]{1,3}){3})(.*?)HTTP/1.1 在此示例中,它始终匹配整个字符串: #include #include int main() { int a, i; regex_t re; regmatch_t pm; char *mpages = “TEST 127.0.0.1 GET /test.php HTTP/1.1\” 404 525 \”-\” \”Mozilla/5.0 (Windows NT HTTP/1.1 TEST”; a = regcomp(&re, “([0-9]{1,3}(\\.[0-9]{1,3}){3})(.*?)HTTP/1.1″, REG_EXTENDED); if(a!=0) printf(” -> Error: Invalid Regex”); a = regexec(&re, &mpages[0], 1, &pm, REG_EXTENDED); if(a==0) { for(i = […]

为什么frexp()不能产生科学记数法?

科学记数法是表达具有明确数量级的数字的常用方法。 首先是非零数字,然后是小数点,然后是小数部分和指数。 在二进制中,只有一个可能的非零数字。 浮点数学涉及隐含的第一个数字等于1,然后尾数位“跟随小数点”。 那么为什么frexp()将小数点放在隐含位的左边,并返回[ frexp()的数字而不是像科学符号那样的[1,2]? 是否有一些溢出要小心? 实际上,它比IEEE 754 / ISO 60559规定的偏差值减去一个以上。在硬件中,这可能会增加XOR的附加值。 单独,这似乎是一个非常弱的论点,考虑到在许多情况下恢复正常将需要另一个浮点运算。

pthreads – 加入一组线程,等待一个退出

在POSIX线程接口中,可以使用pthread_join(thread)来阻塞,直到指定的线程退出。 是否有类似的函数允许执行阻止,直到任何子线程退出? 这与wait() UNIX系统调用类似,但适用于子线程,而不适用于进程

为什么pthread导致内存泄漏

每当我创建一个pthread时,valgrind就会输出内存泄漏, 例如下面的代码: #include #include #include void *timer1_function (void *eit){ (void) eit; printf(“hello world\n”); pthread_exit(NULL); } int main(void){ pthread_t timer1; pthread_create( &timer1, NULL, timer1_function, NULL); ///////line13 int i=0; for(i=0;i<2;i++){usleep(1);} return 0; } valgrind输出 ==1395== HEAP SUMMARY: ==1395== in use at exit: 136 bytes in 1 blocks ==1395== total heap usage: 6 allocs, 5 frees, 1,134 bytes […]

C中的函数重载

今天,看一下open()的手册页,我注意到这个函数”overloaded’: int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 我不认为这是可能的C.实现这一目标的“诀窍”是什么? 后期编辑: 所以它并没有真正超载,因为在使用varargs时 – 你只能提供相同类型的多个参数。 那么, mode_t幕后是一个int吗?

直接从用户程序访问系统调用

在Ubuntu上 – 内核2.6.32.2 如何在没有任何库帮助的情况下直接从用户代码调用已有的系统调用? 我读书和在互联网上解决这个问题,然后写下面的代码但仍然出错。 请帮忙 想要找出当前进程的进程ID #include #include // for __NR_getpid _syscall0(int, getpid) int main() { printf(“Current Process ID : %d\n”,getpid()); return 0; } 编译时出错: root@Omkant:~/os# gcc -Wall getpid.c -o getpid getpid.c:5:16: error: expected declaration specifiers or ‘…’ before ‘getpid’ getpid.c:5:1: warning: data definition has no type or storage class getpid.c:5:1: warning: type defaults […]

将整数值转换为void *并在POSIX中再次返回是否总是安全的?

这个问题几乎与我发现的其他一些问题重复,但这个问题特别涉及POSIX,这是我在pthreads中遇到的一个非常常见的例子。 我主要关心当前的事态(即C99和POSIX.1-2008或更高版本),但任何有趣的历史信息当然也很有趣。 问题基本上归结为b是否总是采用与以下代码中的a相同的值: long int a = /* some valid value */ void *ptr = (void *)a; long int b = (long int)ptr; 我知道这通常有效,但问题是它是否是一个正确的事情(即,C99和/或POSIX标准是否保证它将起作用)。 说到C99似乎没有,我们有6.3.2.3: 5整数可以转换为任何指针类型。 除了之前指定的,结果是实现定义,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示.56) 6任何指针类型都可以转换为整数类型。 除了之前指定的,结果是实现定义。 如果结果无法以整数类型表示,则行为未定义。 结果不必在任何整数类型的值范围内。 即使使用intptr_t,标准似乎只能保证任何有效的void *都可以转换为intptr_t并再次返回,但它不能保证任何intptr_t都可以转换为void *并再次返回。 但是,POSIX标准仍然可以允许这样做。 我没有很大的愿望使用void *作为任何变量的存储空间(即使POSIX应该允许它我觉得它很难看),但我觉得我必须要问因为pthreads_create函数的常见例子使用了start_routine的参数是一个整数,它作为void *传入,并在start_routine函数中转换为int或long int。 例如, 此联机帮助页有这样的示例(请参阅完整代码的链接): //Last argument casts int to void * pthread_create(&tid[i], NULL, sleeping, (void *)SLEEP_TIME); /* … […]

检查文件是目录还是文件

我正在编写一个程序来检查某些东西是文件还是目录。 有没有比这更好的方法呢? #include #include #include #include int isFile(const char* name) { DIR* directory = opendir(name); if(directory != NULL) { closedir(directory); return 0; } if(errno == ENOTDIR) { return 1; } return -1; } int main(void) { const char* file = “./testFile”; const char* directory = “./”; printf(“Is %sa file? %s.\n”, file, ((isFile(file) == 1) ? […]

UNIX便携式primefaces操作

在C中是否有(POSIX-)可移植方式用于primefaces变量操作,类似于使用pthread的可移植线程? primefaces操作是像“递增和获取”这样的操作,它们以primefaces方式执行,这意味着没有上下文切换可以干扰操作。 在Linux内核空间中,我们必须使用atomic_t类型,在Java中我们有java.util.concurrent.atomic包。 在Linux上,atomic.h文件提供primefaces操作,但include是平台相关的,例如#include ,它在Mac OS X上不能以类似的方式提供。

如何防止僵尸子进程?

我正在编写一个服务器,它使用fork()为客户端连接生成处理程序。 服务器不需要知道分叉进程会发生什么 – 它们自己工作,当它们完成时,它们应该只是死而不是变成僵尸。 什么是实现这一目标的简单方法?