c++ - 什么 execl ("/bin/emacs", "/etc/fstab"); 做?
问题描述
例如:
int pid1 = fork();
printf("%s\n", "[1]");
int pid2 = fork();
printf("%s\n", "[2]");
if ((pid1 == 0) && (pid2 == 0)) {
printf("%s\n", "[3]");
execl("/bin/emacs", "/etc/fstab");
int pid3 = fork();
printf("%s\n", "[4]");
} else {
printf("%s\n", "[5]");
}
这条线实际上是做什么的?
该
execl
函数系列用新的过程映像替换当前的过程映像。
所以这个程序启动了,让我们运行一下程序:
它将进程分叉为 2,第一个分叉打印:
[1]
[1]
之后它再次分叉,所以你有 4 个进程和一个打印:
[2]
[2]
[2]
[2]
一个子进程有pid == 0
. 有一个子进程pid1
和一个子进程,pid2
所以会有:
[3]
来了execl
。它在这一点上究竟做了什么?
解决方案
这个问题引起了人们对 fork 新流程的关注,此外它还打算澄清工作是如何execl
工作的。因此,它被声明为:
int execl(const char *path, const char *arg, ...);
其中是 sh 实用程序的未指定路径名,file 是进程映像文件,对于 execvp(),其中 arg0、arg1 等对应于在 argv[0]、argv 1中传递给 execvp() 的值,以及很快。
由 arg0,... 表示的参数是指向以空字符结尾的字符串的指针。这些字符串应构成可用于新过程映像的参数列表。该列表由一个空指针终止。参数 arg0 应该指向一个文件名字符串,该字符串与由 exec 函数之一启动的进程相关联。
(取自execl
文档)
因此,这意味着您缺少一些论点。在这种情况下,您应该像这样使用它:
execl("/bin/emacs", "/bin/emacs", "/etc/fstab", (char*)NULL);
此调用应emacs
使用参数启动编辑器/etc/fstab
- 这意味着emacs
编辑器将打开(如果已安装),fstab
文件内容位于/etc/
.
推荐阅读
- azure - 在 Azure DevOps 管道中,我可以同时使用我的免费 1800 分钟和付费管道吗
- xaml - XAML 的 MouseOver 触发器的进入/退出操作在触摸 UI 元素的边缘时无限循环
- javascript - JQuery 与 Django 基础 .js 文件冲突
- json - 解析逗号分隔的 JSON 文件
- php - 统一查询字符串中相同的 URL 参数
- javascript - 无法自动启动动画
- linux - MongoDB 转储和恢复
- php - SMTP 错误:220 smtpauth.net4india.com ready 无法使用 PHP SMTP 发送电子邮件。您的服务器可能未配置
- python - 将列表加入 Pandas 框架 - 我是否保留了订单?
- c++ - 在 C++ 中使用命名空间指令的正确方法