gpt4 book ai didi

c - 进程终止不影响 waitpid()

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

我需要在 Linux 下使用 C 模拟以下 bash 命令(使用 fork、exec、kill、signal、wait、waitpid、dup2、open、sleep、pipe 等)。

[0] echo 'tail-f $1' > /tmp/rtail
[1]/tmp/rtail ~/.bash_history >> /tmp/1.txt &
PID of process [1] should be saved.
[2] Expect termination of the command started on step [1]. After termination print on the screen: "Program 1 terminated."

到目前为止我有这段代码:

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

int main(int argc, char *argv[]) {
pid_t pID = fork();
if (pID == 0) // child
{
int file = open("/tmp/rtail", O_CREAT | O_WRONLY);

//Now we redirect standard output to the file using dup2
dup2(file, 1);

puts("tail -f $1");
close(file);
system("chmod 777 /tmp/rtail");
exit(0);
} else if (pID < 0) // failed to fork
{
printf("Failed to fork");
exit(1);
// Throw exception
} else // parent
{
pid_t pID2 = fork();
if (pID2 == 0) {
char tmp1[20];
sprintf(tmp1, "echo %i > /tmp/pidprog1", getpid());
system(tmp1);


int file = open("/tmp/1.txt", O_APPEND | O_WRONLY);

//Now we redirect standard output to the file using dup2
dup2(file, 1);
FILE* proc = popen("sh /tmp/rtail ~/.bash_history", "r");
char tmp[20];
while (fgets(tmp, 40, proc) != NULL) {
printf(tmp);
}
fclose(proc);

exit(0);
}
else if (pID2 < 0) // failed to fork
{
printf("Failed to fork");
exit(1);
// Throw exception
} else {
FILE* fl = fopen("/tmp/pidprog1", "r");
char buff[10];
fgets(buff, 10, fl);
int pidc = atoi(buff);
fclose(fl);
int status;
waitpid(pidc, &status, 0);
printf("Program 1 terminated\n");
}
}

// Code executed by both parent and child.

return 0;
}

问题是,当我使用保存在/tmp/pidprog1 中的 PID 手动终止进程时,父进程不会停止等待,也不会打印“程序 1 已终止”行。

最佳答案

父进程很可能将垃圾值读入 pidc。您没有做任何事情来确保孙子在 parent 尝试读取它之前实际上已经写入了 pid。您需要使用 wait 来确保有效的 pids 在文件中。 (或者,只跟踪 fork 的返回值中的 pids。)

你没有做足够的错误检查:如果任何打开失败会发生什么? (例如,当你尝试打开/tmp/1.txt 进行追加,但它还不存在?)

为什么要使用 fgets 将 40 个字符读入大小为 20 的缓冲区?

为什么要复制并使用 fput 而不是只写入 fd?

为什么要将错误消息打印到 stdout 而不是 stderr(使用 perror)。

关于c - 进程终止不影响 waitpid(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7944467/

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