gpt4 book ai didi

c - 什么是子进程?我该如何开始呢? (Linux、C)

转载 作者:行者123 更新时间:2023-11-30 20:14:24 26 4
gpt4 key购买 nike

我对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();
}

最佳答案

修复代码

在代码中,变量名称的拼写保持一致( 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() ”是什么意思?主要替代机制是 vfork() ,这是 fork() 的一个非常受限制的变体(不要使用它);或者也许你可以使用 posix_spawn() posix_spawnp() ——这是极其复杂的替代方案。我认为没有其他选择。

fork 后,您也许可以使用 execvp() 而不是 execve() — 它会为你进行路径搜索。当然,除非练习的目的是实现 execvp()execve()而言.

您的代码使用符号 safefork.c() ,但这在 C 中通常是不正确的;我可以设计一种结构类型来使其工作,但这可能不是您的意思。

We got another file called safefork.c — we are not allowed to use fork, only safefork which is already given.

[...在发布代码之前]

好的;这很好奇。据推测,您有一个 header safefork.h它声明了您应该使用的任何函数(可能是 extern pid_t safefork(void); ),以及文件 safefork.c它做了一些环绕 fork() 的事情。这很奇怪:我不认为 fork() 是一个危险的函数。我很想知道“安全 fork ”的作用,但我怀疑它比标准 fork 功能安全得多。 (我想它可以在调用 fork() 之前执行一些操作,例如 fflush(0) ,或者在 fork() 失败时执行错误退出,但这正在挑战极限。)

[…在代码发布后]

safefork() 代码的批评,我完全认识到这不是您自己的代码,而是提供给您使用的代码。

safefork()的代码是令人憎恶的。它通过 system() 运行 shell运行 pswc找出当前正在运行的进程数量,如果无法执行 fork() 则进入休眠状态 2 秒因为运行的进程太多(超过 6 个,可能包括 safefork() 正在运行的 3 个!),然后返回“我失败”。有人需要他们的头脑来关注(不,那不是你;他是代码的作者)。

哦,还有extern int errno;是不正确的;唯一安全的申报方式 errno来自 #include <errno.h> 。因为这个错误给老师扣了负分。 #include <sys/errno.h>不是一个好主意; #include <sys/types.h>现代 POSIX 中并不经常需要——至少从 POSIX 2008 开始;在此之前可能是不必要的)。在safefork.h的背景下 header ,使其独立确实需要 #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();
}

关于c - 什么是子进程?我该如何开始呢? (Linux、C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26471300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com