标签: posix

24
推荐指数
3
解决办法
2万
查看次数

如果在单独的线程中关闭(2)文件描述符,select(2)会怎么做?

select(2)当一个正在监视读取的文件描述符被另一个线程关闭时,该函数的行为是什么?

从一些粗略的测试,它确实立即返回.我怀疑结果要么是(a)它仍然继续等待数据,但如果你真的试图从它读取你会得到EBADF(可能 - 有一个潜在的竞赛)或(b)它假装好像文件描述符从未传入.如果后一种情况为真,传入一个没有超时的fd将导致死锁,如果它被关闭.

c linux multithreading posix

24
推荐指数
3
解决办法
9840
查看次数

Java线程与Pthreads

我今天在接受采访时被问到这个问题.

"当我们用pthread_create()(POSIX Threads)创建一个线程时,线程就会自行启动.为什么我们需要start()在Java中显式调用.当我们创建一个实例时,Java没有启动该线程的原因是什么."

我是空白,面试官时间不长,最终他无法向我解释原因.

java multithreading posix

24
推荐指数
2
解决办法
1万
查看次数

WEXITSTATUS(状态)返回什么?

我试图了解它是如何WEXITSTATUS(status)工作的.我遇到了一段代码,其中返回值WEXITSTATUS(status)被添加到变量中.

这是片段:

waitpid(-1, &status, 0);
counter += WEXITSTATUS(status);
Run Code Online (Sandbox Code Playgroud)

如何WEXITSTATUS计算返回值?

c unix posix fork signals

24
推荐指数
1
解决办法
8万
查看次数

POSIX风格的操作系统中的命令行选项应该是下划线样式吗?

POSIX样式操作系统中程序的命令行选项名称是否应为下划线样式,如

--cure_world_hunger
Run Code Online (Sandbox Code Playgroud)

或者其他一些风格?

--cureworldhunger
--cure-world-hunger
--cureWorldHunger
Run Code Online (Sandbox Code Playgroud)

什么是最常见的?什么是更好的风格?什么是Bash友好(如果存在这样的事情)?

bash flags posix command-line-arguments

23
推荐指数
2
解决办法
3184
查看次数

PThread vs boost :: thread?

过去没有线程经验,C++中的线程技术对于初学者来说是最简单的吗?boost :: thread还是pthreads?

c++ multithreading boost posix pthreads

23
推荐指数
4
解决办法
2万
查看次数

你如何用正则表达式捕获一个组?

我正在尝试使用正则表达式从另一个字符串中提取字符串.我正在使用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(&regex, SENDER_REGEX, REG_ICASE|REG_EXTENDED) != 0)
    printf("regcomp error\n");
  status = regexec(&regex, av[1], 1, pmatch, 0);
  regfree(&regex);
  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)

c regex posix

23
推荐指数
2
解决办法
2万
查看次数

为什么反斜杠会阻止别名扩展?

在我的问题的第一部分,我将提供一些背景信息作为社区服务.第二部分包含实际问题.

第一部分

假设我创建了以下别名:

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)一致:

"应检查一个被识别为简单命令的命令名字的结果字,以确定它是否是一个不带引号的有效别名."

Bash参考手册(6.6):

"检查每个简单命令的第一个单词,如果没有引用,则检查它是否有别名."

第二部分

这是一个问题:为什么案例6(通过说法覆盖别名\ls)考虑引用这个词?为了与这个问题的风格保持一致,我正在寻找对"官方"文档的引用.

文档说反斜杠只转义后续字符,而不是单引号和双引号引用一系列字符. POSIX标准(2.2.1):

"未引用的反斜杠应保留以下字符的字面值,但<newline>除外"

Bash参考手册(3.1.2.1):

"一个非引用的反斜杠'\'是Bash转义字符.它保留了下一个字符的字面值,除了换行符."

(顺便说一句,是不是"下一个角色"有点矫枉过正?)

一个可能的答案可能是这种情况并不那么特别:它类似于ANSI-C引用中的一些情况,例如\nnn.然而,这仍然是逸出的单个字符(八位字符,其值是八进制值NNN),而不是一个字符序列.

bash shell alias posix escaping

23
推荐指数
2
解决办法
4428
查看次数

将整数值转换为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;
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的并行编程简介)中看到了类似的例子.考虑到它似乎是一个常见的例子,人们应该比我更了解这些东西,我想知道我是否错了,这实际上是一个安全和便携的事情.

c posix pthreads c99

23
推荐指数
2
解决办法
4155
查看次数

为什么创建系统调用称为creat?

为什么要调用创建系统调用creat

另外,为什么要调用缓冲区大小的定义BUFSIZ而不是BUFSIZE

还有其他这样的例子吗?

相关:(摘自评论)
肯汤普森在说"我用'e'创作拼写时"的意思.

c unix linux posix

23
推荐指数
4
解决办法
1万
查看次数