为什么在 Unix 文件系统设计中存在open()并close()存在?
操作系统不能只检测第一次read()或被write()调用并做open()通常会做的事情吗?
我正在尝试学习 UNIX 编程,但遇到了一个关于 fork() 的问题。我知道 fork() 创建了一个与当前正在运行的进程相同的进程,但是它从哪里开始呢?例如,如果我有代码
int main (int argc, char **argv)
{
int retval;
printf ("This is most definitely the parent process\n");
fflush (stdout);
retval = fork ();
printf ("Which process printed this?\n");
return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
这绝对是父进程
哪个进程打印了这个?
哪个过程打印了这个?
我认为这fork()会创建一个相同的过程,所以我最初认为在该程序中,该fork()调用将永远递归调用。我猜是fork()在fork()通话后从头创建的新进程?
如果我添加以下代码,以区分父进程和子进程,
if (child_pid = fork ()) printf ("This is the parent, child pid is %d\n", child_pid);
else printf ("This is the child, pid is %d\n",getpid ());
Run Code Online (Sandbox Code Playgroud)
在 fork() 调用之后,子进程从哪里开始执行?
grepping、awking、sedding 和管道是任何类 Unix 操作系统用户的日常例行程序,无论是在命令行上还是在 shell 脚本中(从现在开始统称为过滤器)。
从本质上讲,当使用“标准”Unix CLI 程序和 shell 内置程序(从现在开始统称为命令)时,过滤器需要在每个过滤器步骤中为 stdin、stdout 和 stderr 提供精确的预期格式才能正常工作。在下文中,我将某些命令的这种精确预期格式称为此命令的 API。
作为具有 Web 开发背景的人,我将这种数据收集和数据处理在技术上与Web 抓取进行了比较- 这种技术在数据呈现方式发生最细微的变化时非常不稳定。
我的问题现在与 Unix 命令 API 的稳定性有关。
我注意到根据网卡的品牌,接口名称有所不同(我想取决于驱动程序)。
确切地说,在 pfSense 下,我无法将 ALTQ 与链路聚合 (LAG) 虚拟接口一起使用。
由于缺乏适当的抽象层,这是 BSD 内部限制吗?
我总是假设/ ... 系统调用st_blocks返回的字段用于获取文件的磁盘使用情况以 512 字节为单位表示。stat()lstat()du
检查POSIX 规范,我现在看到 POSIX 对此没有做出保证。其自身功能的文档perlstat()也警告不要做出这种假设。
无论如何,正如 POSIX 所指示的,该块大小与st_blksize返回的字段无关stat(),因此必须在其他地方找到。
检查 GNUdu或 GNUfind源代码,我看到 HP/UX 使用 1024 字节单位的证据。GNUfind调整其-printf %b输出以始终提供多个 512 字节单位,这可能是我困惑的根源。
目前是否还有其他仍在使用的类 Unix 系统st_blocks不是以 512 字节为单位表示的?这可以依赖于文件系统吗(正如 POSIX 所建议的那样)?我想安装 HP/UX NFS 共享可以做到这一点。
给定一个 linux TCP 套接字的 inode(通过 获得/proc/<pid>/fd),有没有更快的方法来查找我可以从/proc/net/tcp这个套接字中获得的信息?
我编写了一个故障排除工具,它监视进程并打印有关 IO 操作的实时信息(strace-type 信息收集到更高级别的抽象中并以不那么原始的方式呈现),但是在负载很重的网络服务器上,我发现它需要时间查找套接字信息(例如外部地址/端口)是令人望而却步的,因为它的大小非常大/proc/net/tcp(我目前正在查看的服务器上大约有 2MB)。
我可以通过缓存来管理这个,但这必然会引入延迟,让我怀疑“API”的荒谬性,它需要读取和解析 2MB 的 ASCII 文本才能找到有关套接字的信息。
可以在 Linux 下挂载 Apple HFS+ 和 Microsoft NTFS 文件系统。
两个文件系统都支持每个文件的多个内容流,尽管这并没有被广泛使用。
是否有(半)标准方法可以从 Linux 访问这些文件系统功能?如果是这样,两个文件系统之间的方法是统一的还是只有神秘的临时方法可用?(也许有ioctls 的东西?)
我已阅读 的手册页Curl,但我无法理解这些参数(k、i 和 X)的含义。我看到它在 REST API 调用中使用,但有人可以解释这三个参数的作用吗?文档中没有说清楚。
先感谢您。
waitpid()如果我是正确的,进程会通过调用或函数来等待其子进程终止或停止wait()。
waitpid()SIGCHLD信号和or函数有什么关系wait()?
waitpid()当进程调用或wait()函数时,进程会自行挂起直到子进程终止/停止(这与向其发送 SIGCHLD 信号之前相同)是否正确?
(pause()挂起当前进程,直到有任何信号发送给它。所以我想知道是否waitpid()类似,除了直到 SIGCHLD 发送给它?)
当 SIGCHLD 被发送到已通过调用挂起的进程时waitpid(),执行 SIGCHLD 处理程序和从挂起中恢复之间的顺序是什么waitpid()?
(在以下计算机系统示例中:程序员的视角,SIGCHLD 处理程序调用waitpid()。)
谢谢。
void handler(int sig)
{
int olderrno = errno;
while (waitpid(-1, NULL, 0) > 0) {
Sio_puts("Handler reaped child\n");
}
if (errno != ECHILD)
Sio_error("waitpid error");
Sleep(1);
errno = olderrno;
}
int main()
{
int i, n;
char buf[MAXBUF];
if (signal(SIGCHLD, handler1) == SIG_ERR)
unix_error("signal error"); …Run Code Online (Sandbox Code Playgroud) api ×10
linux ×3
command-line ×2
filesystems ×2
kernel ×2
networking ×2
architecture ×1
c ×1
conventions ×1
curl ×1
files ×1
filter ×1
fork ×1
freebsd ×1
linux-kernel ×1
man ×1
ntfs ×1
pfsense ×1
portability ×1
proc ×1
process ×1
shell ×1
signals ×1
standard ×1
stat ×1
system-calls ×1
tcp ×1
wait ×1