在释放模式(VC++)中是否忽略了assert(false)?
select(2)当一个正在监视读取的文件描述符被另一个线程关闭时,该函数的行为是什么?
从一些粗略的测试,它确实立即返回.我怀疑结果要么是(a)它仍然继续等待数据,但如果你真的试图从它读取你会得到EBADF(可能 - 有一个潜在的竞赛)或(b)它假装好像文件描述符从未传入.如果后一种情况为真,传入一个没有超时的fd将导致死锁,如果它被关闭.
我今天在接受采访时被问到这个问题.
"当我们用pthread_create()(POSIX Threads)创建一个线程时,线程就会自行启动.为什么我们需要start()在Java中显式调用.当我们创建一个实例时,Java没有启动该线程的原因是什么."
我是空白,面试官时间不长,最终他无法向我解释原因.
我试图了解它是如何WEXITSTATUS(status)工作的.我遇到了一段代码,其中返回值WEXITSTATUS(status)被添加到变量中.
这是片段:
waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);
Run Code Online (Sandbox Code Playgroud)
如何WEXITSTATUS计算返回值?
POSIX样式操作系统中程序的命令行选项名称是否应为下划线样式,如
--cure_world_hunger
Run Code Online (Sandbox Code Playgroud)
或者其他一些风格?
--cureworldhunger
--cure-world-hunger
--cureWorldHunger
Run Code Online (Sandbox Code Playgroud)
什么是最常见的?什么是更好的风格?什么是Bash友好(如果存在这样的事情)?
过去没有线程经验,C++中的线程技术对于初学者来说是最简单的吗?boost :: thread还是pthreads?
我正在尝试使用正则表达式从另一个字符串中提取字符串.我正在使用POSIX正则表达式函数(regcomp, regexec...),我在捕获一个组时失败了......
例如,让模式像"MAIL FROM:<(.*)>"
(使用REG_EXTENDEDcflags)一样简单
我想捕捉'<'和'>'之间的所有内容
我的问题是regmatch_t给了我整个模式的边界(MAIL FROM:<...>)而不是括号之间的内容......
我错过了什么?
提前致谢,
编辑:一些代码
#define SENDER_REGEX "MAIL FROM:<(.*)>"
int main(int ac, char **av)
{
regex_t regex;
int status;
regmatch_t pmatch[1];
if (regcomp(®ex, SENDER_REGEX, REG_ICASE|REG_EXTENDED) != 0)
printf("regcomp error\n");
status = regexec(®ex, av[1], 1, pmatch, 0);
regfree(®ex);
if (!status)
printf( "matched from %d (%c) to %d (%c)\n"
, pmatch[0].rm_so
, av[1][pmatch[0].rm_so]
, pmatch[0].rm_eo
, av[1][pmatch[0].rm_eo]
);
return (0);
}
Run Code Online (Sandbox Code Playgroud)
输出:
$./a.out "012345MAIL FROM:<abcd>$"
matched from 6 (M) …Run Code Online (Sandbox Code Playgroud) 在我的问题的第一部分,我将提供一些背景信息作为社区服务.第二部分包含实际问题.
第一部分
假设我创建了以下别名:
alias ls='ls -r'
Run Code Online (Sandbox Code Playgroud)
我知道如何使用以下方式暂时unalias(即覆盖此别名),使用:
1)命令的完整路径名: /bin/ls
2)命令替换: $(which ls)
3)内置命令: command ls
4)双引号: "ls"
5)单引号: 'ls'
6)反斜杠字符: \ls
案例1是显而易见的,案例2只是一种变化.案例3中内置的命令旨在忽略shell函数,但显然它也可用于规避别名.最后,案例4和5与POSIX标准(2.3.1)一致:
"应检查一个被识别为简单命令的命令名字的结果字,以确定它是否是一个不带引号的有效别名."
"检查每个简单命令的第一个单词,如果没有引用,则检查它是否有别名."
第二部分
这是一个问题:为什么案例6(通过说法覆盖别名\ls)考虑引用这个词?为了与这个问题的风格保持一致,我正在寻找对"官方"文档的引用.
文档说反斜杠只转义后续字符,而不是单引号和双引号引用一系列字符. POSIX标准(2.2.1):
"未引用的反斜杠应保留以下字符的字面值,但<newline>除外"
"一个非引用的反斜杠'\'是Bash转义字符.它保留了下一个字符的字面值,除了换行符."
(顺便说一句,是不是"下一个角色"有点矫枉过正?)
一个可能的答案可能是这种情况并不那么特别:它类似于ANSI-C引用中的一些情况,例如\nnn.然而,这仍然是逸出的单个字符(八位字符,其值是八进制值NNN),而不是一个字符序列.
这个问题几乎与我发现的其他一些问题相同,但这个问题特别涉及POSIX,这是我在pthreads中遇到的一个非常常见的例子.我主要关注当前的事态(即C99和POSIX.1-2008或更高版本),但任何有趣的历史信息当然也很有趣.
问题基本上归结为b是否总是采用与以下代码中的a相同的值:
long int a = /* some valid value */
void *ptr = (void *)a;
long int b = (long int)ptr;
Run Code Online (Sandbox Code Playgroud)
我知道这通常有效,但问题是它是否是正确的事情(即,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);
/* ... */
void * sleeping(void *arg){
//Casting void * back to int
int sleep_time = (int)arg;
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
我也在教科书(Peter S. Pacheco的并行编程简介)中看到了类似的例子.考虑到它似乎是一个常见的例子,人们应该比我更了解这些东西,我想知道我是否错了,这实际上是一个安全和便携的事情.