什么是儿童过程?我该如何开始呢? (Linux,C)

时间:2014-10-20 17:19:40

标签: c linux process pid child-process

我根本不熟悉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();
}

1 个答案:

答案 0 :(得分:2)

修复代码

在您的代码中,获取一致拼写变量的名称(child_idchildId不同)。

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,它运行wcfork()以查找您当前运行的进程数,如果您无法执行此操作,则会进入睡眠状态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}}