gpt4 book ai didi

c - 如何正确使用fork、exec、wait

转载 作者:太空狗 更新时间:2023-10-29 16:25:35 25 4
gpt4 key购买 nike

我正在编写的 shell 需要执行用户给它的程序。这是我的程序的非常简短的简化版本

int main()
{
pid_t pid = getpid(); // this is the parents pid

char *user_input = NULL;
size_t line_sz = 0;
ssize_t line_ct = 0;

line_ct = getline(&user_input, &line_sz, stdin); //so get user input, store in user_input

for (;;)
{
pid_t child_pid = fork(); //fork a duplicate process

pid_t child_ppid = getppid(); //get the child's parent pid

if (child_ppid == pid) //if the current process is a child of the main process
{
exec(); //here I need to execute whatever program was given to user_input
exit(1); //making sure to avoid fork bomb
}

wait(); //so if it's the parent process we need to wait for the child process to finish, right?

}
}
  1. 我是否派生了新进程并检查了它是否是一个正确的子进程
  2. 我可以在这里使用什么 exec 来完成我想做的事情?什么是最简单的方法
  3. 我等待的理由是什么?我正在查看的文档没有多大帮助

假设用户可能输入类似 ls、ps、pwd 的内容

谢谢。

编辑:

const char* hold = strdup(input_line);
char* argv[2];

argv[0] = input_line;
argv[1] = NULL;

char* envp[1];
envp[0] = NULL;

execve(hold, argv, envp);

最佳答案

这是一个简单易读的解决方案:

pid_t parent = getpid();
pid_t pid = fork();

if (pid == -1)
{
// error, failed to fork()
}
else if (pid > 0)
{
int status;
waitpid(pid, &status, 0);
}
else
{
// we are the child
execve(...);
_exit(EXIT_FAILURE); // exec never returns
}

如果子项需要知道父项的 PID(尽管在本例中我不知道),则子项可以使用存储值 parent。 parent 只是等待 child 完成。实际上,子进程在父进程内部“同步”运行,没有并行性。 parent 可以查询 status 以查看 child 以何种方式退出(成功、失败或有信号)。

关于c - 如何正确使用fork、exec、wait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19099663/

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