标签: system-calls

在 NFS 上 flock(2) 与 fcntl(2)

Perl 5.x 文档指出,它的 flock(..) 实现将使用以下本地调用之一,从 1 开始,如果不可用,则朝 3 工作:

  1. 羊群(2)
  2. fcntl(2)
  3. 锁(3)

没关系。但是,您可能已经注意到他们的免责声明,即不应在 NFS 上使用 flock(2)。该文档建议使用 -Ud_flock 标志来强制 Perl 使用 flock(2)。flock(2) 的手册页(在 Redhat 上)陈述了关于 NFS 问题的类似免责声明。

我的问题是,为什么!?!?我似乎找不到深入的文章或解释为什么 flock(2) 在 NFS 上不安全。

我已经在 Redhat(使用 flock(2) 的地方)和 Solaris(使用 fcntl(2) 的地方)用 C 和 Perl 编写了几个测试脚本。我运行了 strace/truss 以确保 Perl 确实分别使用了 flock(2) 和 fcntl(2)。我无法复制任何没有兑现锁的问题!是什么赋予了??

nfs system-calls

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

如何理解管道

当我刚刚在 bash 中使用管道时,我没有考虑更多。但是当我阅读一些使用系统调用 pipe() 和 fork() 的 C 代码示例时,我想知道如何理解管道,包括匿名管道和命名管道。

经常听到“Linux/Unix 中的一切都是文件”。我想知道管道是否实际上是一个文件,以便它连接的一部分写入管道文件,另一部分从管道文件读取?如果是,创建的匿名管道的管道文件在哪里?在 /tmp、/dev 或 ...?

但是,从命名管道的例子中,我也了解到使用管道比显式使用临时文件具有空间和时间性能优势,可能是因为管道的实现不涉及文件。此外,管道似乎不像文件那样存储数据。所以我怀疑管道实际上是一个文件。

shell pipe system-calls architecture

21
推荐指数
1
解决办法
6575
查看次数

如果不是编程语言中的实现,“系统调用”是什么意思?

我想了解术语“系统调用”。我熟悉系统调用用于从用户空间应用程序获取内核服务。

我需要澄清的部分是“系统调用”和“系统调用的 C 实现”之间的区别。

这是一个让我困惑的引用:

在类 Unix 系统上,该 API 通常是 C 库 (libc) 实现的一部分,例如 glibc,它为系统调用提供包装函数,通常与它们调用的系统调用命名相同

什么是“他们调用的系统调用”?他们的来源在哪里?我可以将它们直接包含在我的代码中吗?

一般意义上的“系统调用”是否只是 POSIX 定义的接口,但要实际查看实现,可以检查 C 源代码并在其中查看实际用户空间与内核通信的实际情况?

背景说明:我试图了解是否每个 c 函数最终都与来自/dev.

c kernel system-calls posix

17
推荐指数
3
解决办法
6061
查看次数

Linux 中的库调用和系统调用有什么区别?

我想知道 Linux 中的库调用和系统调用有什么区别。任何能够很好地理解两者背后的概念的指针将不胜感激。

linux libraries system-calls

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

系统调用、消息传递和中断之间的关系是什么?

我正在阅读有关流程管理的维基百科文章。我的重点是Linux。我无法弄清楚系统调用、消息传递和中断之间的关系和区别,它们的概念和目的。它们都是为了进程向内核请求资源和服务吗?

文章中的一些引用和其他一些引用:

  1. 操作系统有两种可能的方式在程序执行期间重新获得对处理器的控制,以便操作系统执行取消分配或分配:

    1. 进程发出系统调用(有时称为软件中断);例如,发生 I/O 请求,请求访问硬盘上的文件。
    2. 发生硬件中断;例如,在键盘上按下了一个键,或者计时器用完了(用于抢先式多任务处理)。
  2. 在用户模式下执行的程序可以通过两种技术请求内核的服务:

    * System call
    * Message passing
    
    Run Code Online (Sandbox Code Playgroud)
  3. 中断是指示需要注意的异步信号或指示需要更改执行的软件中的同步事件。

    硬件中断使处理器保存其执行状态并开始执行中断处理程序。软件中断通常作为指令集中的指令来实现,这会导致上下文切换到类似于硬件中断的中断处理程序。

system-calls interrupt architecture

14
推荐指数
3
解决办法
1万
查看次数

fork() 和 vfork() 有什么区别?

我想详细了解 fork() 和 vfork() 之间的区别。我无法完全消化手册页。

我还要澄清一下我的一位同事评论“在当前的 Linux 中,没有 vfork(),即使你调用它,它也会在内部调用 fork()”

linux system-calls fork

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

为什么 vfork 或 fork 的孩子应该调用 _exit() 而不是 exit()?

从手册页vfork()

vfork() 与 fork() 的不同之处在于父进程被挂起,直到子进程调用 execve(2) 或 _exit(2)。子进程与其父进程共享所有内存,包括堆栈,直到子进程发出 execve()。子进程不能从当前函数返回或调用 exit(),但可以调用 _exit()。

为什么孩子应该使用 an_exit()而不是简单地调用exit()?我希望这适用于vfork()fork()

c system-calls fork exit

13
推荐指数
1
解决办法
8069
查看次数

慢系统调用和快系统调用的区别

慢系统调用和快系统调用有什么区别?我了解到如果进程捕捉到一些信号,慢系统调用会阻塞,因为捕捉到的信号可能会唤醒被阻塞的系统调用,但我不能完全理解这种机制。任何例子将不胜感激。

system-programming system-calls

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

已经绑定的TCP本地socket地址关闭后多久不可用?

在 Linux 上(我的实时服务器在 RHEL 5.5 上 - 下面的 LXR 链接指向内核版本),man 7 ip说:

已绑定的 TCP 本地套接字地址在关闭后的一段时间内不可用,除非设置了 SO_REUSEADDR 标志。

我没有使用SO_REUSEADDR. “一段时间”是多长时间?我怎样才能知道它有多长,我怎样才能改变它?

我一直在谷歌上搜索这个,并找到了一些信息,但没有一个能从应用程序程序员的角度真正解释这一点。以机智:

  • TCP_TIMEWAIT_LENnet/tcp.h是“要等待多久才能破坏TIME-WAIT状态”,固定为“大约60秒”
  • /proc/sys/net/ipv4/tcp_fin_timeout是“将套接字保持在 FIN-WAIT-2 状态的时间,如果它被我们这边关闭了”,“默认值为 60 秒”

我绊倒的地方在于弥合内核的 TCP 生命周期模型和程序员的端口不可用模型之间的差距,即理解这些状态与“一段时间”的关系。

linux system-calls tcp timeout socket

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

从哪里获取“/etc/ld.so.nohwcap”文件?

当我通过strace实用程序运行命令时,我可以看到访问错误,例如

access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)

现在我在某处读到,上面一行中发生的事情是链接器正在寻找我正在运行的命令的优化版本,但找不到它。

我该如何解决这个问题?我需要安装什么软件包才能ld.so.nohwcap在系统上拥有该文件?即使不是出于优化目的而只是为了摆脱strace?

debugging system-calls dynamic-linking strace ld

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