【发布时间】:2014-10-20 17:19:40
【问题描述】:
我对 C 完全不熟悉。
如何启动子进程?这个子进程将通过调用execve() 来执行指定的命令。命令执行后会尝试在环境变量PATH指定的文件目录中搜索
发现为可执行文件。
到目前为止我已经这样做了:
//Do commands
pid_t childId;
// Fork the child process
child_id = safefork.c(); //can't use fork();
safefork.c
导师提供的代码;不要诅咒信使!
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/errno.h>
extern int errno;
#define MAX_PROCESSES 6
static int n_processes(void)
{
return system("exit `/bin/ps | /store/bin/wc -l`")/256;
}
pid_t safefork(void)
{
static int n_initial = -1;
if (n_initial == -1) /* Første gang funksjonen kalles: */
n_initial = n_processes();
else if (n_processes() >= n_initial+MAX_PROCESSES) {
sleep(2);
errno = EAGAIN;
return (pid_t)-1;
}
return fork();
}
【问题讨论】:
-
为什么不能使用fork??我认为除了
fork()之外,没有其他方法可以分叉子进程 -
欢迎来到 Stack Overflow。请尽快阅读About 页面。符号
safefork.c()在 C 中并不常见;我可以设计一种结构类型来使它工作,但这可能不是你的意思。 “不能使用fork()”是什么意思?主要的替代机制是vfork(),这是fork()的一个非常受限的变体(不要使用它);或者你可以使用posix_spawn()或posix_spawnp()——它们是非常复杂的替代方案。我认为没有其他选择。分叉后,您可以使用execvp()而不是execve()- 它会为您进行路径搜索。 -
我们得到了另一个名为 safefork 的文件 :) 我们不允许使用 fork,只能使用已经给出的 safefork
-
好的;这很好奇。大概,你有一个标题
safefork.h,它声明了你应该使用的任何函数(可能是extern int safefork(void);),还有一个文件safefork.c,它做了一些事情来环绕fork()或其他什么。 '这很奇怪:我不认为fork()是一个危险的功能。我很想知道“安全叉子”的作用,但我怀疑它是否比标准叉子功能更安全。 (我想它可以在调用fork()之前执行一些类似fflush(0)的操作,或者在fork()失败时执行错误退出,但这是在挑战极限。) -
'safefork()` 的代码令人憎恶。它运行一个运行
ps和wc的 shell,以找出您当前正在运行的进程数,如果您不能执行fork(),则进入睡眠 2 秒,因为有太多(超过 6 ,包括safefork()正在运行的3 个!)然后返回“我失败了”。有人需要他们的头脑注意(不,那不是你;它是代码的作者)。哦,extern int errno;不正确;声明errno的唯一安全方法是通过#include <errno.h>。这个错误给老师打负分。
标签: c linux process pid child-process