小编Vit*_*olt的帖子

使用 fgets 读取输入会返回 C 中的重复行

我正在尝试一些用于 shell 实现的 C 代码,发现在 fork 一个进程后, fgets() 返回重复的行,这是我无法理解的,我将非常感谢任何帮助。

我的问题是:分叉是否会更改父进程中任何打开文件的偏移量?这似乎发生在我的程序中。

根据下面的答案 @Vadim Ponomarev 和我的理解: fgets() 不是线程安全的(或者严格来说,它是线程安全的,但是分叉​​一个进程会导致标准输入以某种方式初始化,从而导致共享文件偏移量的更改) )。

代码如下:

int main() {

  char buf[200];
  int r;
  pid_t pid = 0;

  while(getcmd(buf, 200, pid) >= 0) {
    fprintf(stderr, "current pid: %d\n", getpid());
    pid = fork();
    // Without forking the fgets() reads all lines normally
    if(pid == 0)
      exit(0);

    wait(&r);
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

getcmd() 函数只是一个包装器:

int
getcmd(char *buf, int nbuf, pid_t pid)
{
  memset(buf, 0, nbuf);
  if (fgets(buf, nbuf, stdin) == NULL) …
Run Code Online (Sandbox Code Playgroud)

c io shell process fgets

5
推荐指数
1
解决办法
1240
查看次数

正则表达式中的Perl正则表达式

我想问一下是否可以在替换匹配表达式的RHS中使用"e"修饰符放入另一个正则表达式.

例如,我想用相同数量的" - "替换$ foo中存储的任何单词,不区分大小写.

例如:

$str =~ s/($foo)/$temp = $1; $temp ~= s/./-//gie;
Run Code Online (Sandbox Code Playgroud)

但是在编译时它经常会出现语法错误

$str =~ s/($foo)/$temp = $1; $temp = "---"/gie; 
Run Code Online (Sandbox Code Playgroud)

确实有效.

我想我没有正确地逃避斜线,任何想法?

regex perl expression

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

标签 统计

c ×1

expression ×1

fgets ×1

io ×1

perl ×1

process ×1

regex ×1

shell ×1