我根本不熟悉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();
}
答案 0 :(得分:2)
在您的代码中,获取一致拼写变量的名称(child_id
与childId
不同)。
pid_t child_id = simplefork();
if (child_id < 0)
{
...handle error...
}
else if (child_id == 0)
{
...do childish code - execve() etc...
}
else
{
...do parental code - waitpid() etc...
}
请注意,fork()
函数中您simplefork()
调用的fork()
调用负责创建新进程。这就是全部;这是除了第一个流程以外所有流程的完成方式。
fork()
?你是什么意思&#34;不能使用fork()
&#34;?主要的替代机制是vfork()
,这是posix_spawnp()
的一个非常有限的变体(不要使用它);或者你可以使用posix_spawn()
或execvp()
- 这是非常复杂的选择。我不认为还有其他选择。
分叉后,您可以使用execvp()
代替execve()
- 它会为您搜索路径。当然,除非这个练习的目的是在execve()
方面实施safefork.c()
。
您的代码使用符号safefork.c
,但在C中通常不正确;我可以设计一种可以使其工作的结构类型,但它可能不是你的意思。
我们收到了另一个名为
fork
的文件 - 我们不允许使用safefork
,只允许使用safefork.h
。
[...代码发布之前]
行;这非常好奇。据推测,你有一个标题extern pid_t safefork(void);
,它声明你应该使用的任何函数(可能是safefork.c
),以及文件fork()
,它可以包含safefork()
。 }。奇怪的是:我不认为fork()是一个危险的功能。我很想知道什么是安全的叉子&#39;确实如此,但我怀疑它比标准的fork功能更安全。 (我想它可以在调用fork()之前执行一些像fflush(0)这样的事情,或者如果fork()失败则执行错误退出,但是它会推送信封。)
[...代码发布后]
对safefork()
代码的批评,我完全认识到这不是你自己的代码,而是给你使用的代码。
system()
的代码是令人厌恶的。它通过ps
运行一个shell,它运行wc
和fork()
以查找您当前运行的进程数,如果您无法执行此操作,则会进入睡眠状态2秒safefork()
因为运行的进程太多(超过6个,可能包括extern int errno;
正在运行的3个进程!)然后返回&#34;我失败了#34;。有人需要他们的头脑(并且不,那不是你;它是代码的作者)。
哦,errno
不正确;声明#include <errno.h>
的唯一安全方法是#include <sys/errno.h>
。这个错误给老师带来负面影响。 #include <sys/types.h>
不是一个好主意;在现代POSIX中通常不需要safefork.h
- 从POSIX 2008开始,无论如何都是如此;在此之前可能没有必要)。在#include <sys/types.h>
标题的上下文中,使其自包含需要safefork()
。
即使假设safefork.h
是一个好主意(它不是),也应如下所示实现。
#ifndef SAFEFORK_H_INCLUDED
#define SAFEFORK_H_INCLUDED
#include <sys/types.h> // pid_t
extern pid_t safefork(void);
#endif
safefork.c
#include "safefork.h"
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#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)
n_initial = n_processes();
else if (n_processes() >= n_initial+MAX_PROCESSES)
{
errno = EAGAIN;
return (pid_t)-1;
}
return fork();
}
{{1}}