gpt4 book ai didi

c - 当我重定向输出时,fork 和等待过程不适用于 mke2fs

转载 作者:太空宇宙 更新时间:2023-11-04 08:48:31 25 4
gpt4 key购买 nike

我需要 fork 一个进程,重定向缓冲区中的输出(stdout 和 stderr)。我的代码似乎适用于大多数二进制文件,但不是全部。例如,我可以使用很长的“ls”来运行我的代码,比如 ls -R/proc/并且它运行良好。当我运行 mke2fs 进程时,我的代码不再工作。

如果我在 fork 中运行 mke2fs 并等待它,它会完美运行。现在,如果我添加重定向内容,我的程序将永远无法运行。

我写了一些 main 来测试这个特定的问题:

#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main ()
{
pid_t pid;
int status = -42;
int pipefd_out[2];
int pipefd_err[2];
char buf_stderr[1024];
char buf_stdout[1024];
int count;
int ret;

pipe(pipefd_out);
pipe(pipefd_err);

memset (buf_stdout, 0, 1024);
memset (buf_stderr, 0, 1024);

pid = fork ();

if (pid == -1)
{
fprintf (stderr, "Error when forking process : /usr/sbin/mke2fs\n");
return 1;
}

if (pid == 0)
{
close(pipefd_out[0]);
close(pipefd_err[0]);

dup2(pipefd_out[1], 1);
dup2(pipefd_err[1], 2);

close(pipefd_out[1]);
close(pipefd_err[1]);

char **args;

args = malloc (sizeof (1024));
args[0] = strdup("/usr/sbin/mke2fs");
args[1] = strdup("/dev/sda4");
args[2] = strdup("-t");
args[3] = strdup("ext4");
args[4] = NULL;

execvp ("/usr/sbin/mke2fs", args);

/*
args = malloc (sizeof (1024));
args[0] = strdup("/bin/ls");
args[1] = strdup("-R");
args[2] = strdup("/proc/irq");
args[3] = NULL;

execvp ("/bin/ls", args);
*/
perror ("execv");
fprintf (stderr, "Error when execvp process /usr/sbin/mke2fs\n");
return 1;
}
close(pipefd_out[1]);
close(pipefd_err[1]);

if (waitpid(pid, &status, 0) == -1)
{
fprintf (stderr, "Error when waiting pid : %d\n", pid);
return 1;
}

do
{
count = read(pipefd_out[0], buf_stdout, sizeof(buf_stdout));
}
while (count != 0);
do
{
count = read(pipefd_err[0], buf_stderr, sizeof(buf_stderr));
}
while (count != 0);

ret = WEXITSTATUS(status);

FILE* file = NULL;
file = fopen("/root/TUTU", "w");

if (file != NULL)
{
fwrite(buf_stdout, 1, sizeof(buf_stdout), file);
fwrite(buf_stderr, 1, sizeof(buf_stdout), file);
fclose(file);
}

return 0;
}

如果我运行 ps,我可以看到我的子进程正在运行:

# ps | grep sda4
936 root 2696 S {mke2fs} /dev/sda4 -t ext4

我无法理解为什么会出现这种奇怪的行为。不确定它是否相关,但 mke2fs 的输出不是经典的。该过程似乎在计算期间更新输出,而不是打印输出并向前移动提示。它是一种进度条。不确定我的解释是否真的很清楚。

谢谢,伊娃。

最佳答案

在从管道读取其标准输出/标准错误之前,您不能等待程序完成(您使用 waitpid 执行的操作)。当程序写入管道并且它已满时,它将休眠,直到您从管道中读取以在其中腾出空间。因此,程序会一直等到管道中有更多空间,然后才能继续并退出,而您则在等待程序退出,然后再从管道中读取以在其中腾出空间。

在这种情况下,最简单的解决方案是将 waitpid 移动到完成从管道读取之后。应该没问题,因为您执行的程序将在退出时关闭管道。

关于c - 当我重定向输出时,fork 和等待过程不适用于 mke2fs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20634001/

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