gpt4 book ai didi

c - 通过 execve 从 child 调用的排序不会自然终止

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

我正试图通过一个已经被 sort 的标准输入复制的管道推送一些文本文件。它有效,但它不会自然终止(有趣的是,按下“输入”按钮似乎就可以终止)。

//child
if(rc == 0)
{
alarm(60);
close(stdin_pipe_fds[1]);

close(0);
dup(stdin_pipe_fds[0]);
close(stdin_pipe_fds[0]);
execve("/usr/bin/sort", argv, NULL);
exit(0);
}

//Parent
if(rc >0)
{
alarm(60);
close(stdin_pipe_fds[0]);
close(stdout_pipe_fds[1]);
close(stderr_pipe_fds[1]);
while(fscanf(coolFile, "%1023s", newWord) ==1)
{
if(strcmp(newWord, "foobar") != 0)
{
write(stdin_pipe_fds[1], newWord, (strlen(newWord)+1));
}
}
if(argc == 2)
{
write(stdin_pipe, argc[2], 2);
}
if(argc == 3)
{
write(stdin_pipe, argc[3], 2);
}
}

有什么想法吗?

最佳答案

这里有一个更简单的方法来显示相同​​的效果:

$ cd /
$ ls -1 & # 1
[1] 58745
myuser@myhost / $ Applications # 2
Library # 3
Network
System
Users
Volumes # 4
  1. 命令在后台运行。
  2. 你得到你的提示
  3. 命令的输出开始覆盖提示
  4. 后台命令退出,但这不会导致提示重绘。由于您没有看到提示(它在第 2 步中被丢弃),您认为该过程仍在运行。
  5. 当您按下回车键时,提示会重新绘制。由于您现在再次看到可见提示,您错误地认为 Enter 导致程序退出。

相反,您可以只盲目地键入 echo "Hello World" 并按回车键,您会发现 shell 的响应非常好。这纯粹是一个外观问题。

要解决这个问题,您应该:

  1. 让父级 wait() 为子级,这样它就不会在子级退出之前退出。
  2. 确保父级完全关闭管道(等待之前)。以前,您的 parent 会立即退出并关闭管道。由于它现在将等待子级,因此您必须手动关闭管道以避免出现死锁,即父级等待子级退出,而子级等待父级继续或结束输入。

关于c - 通过 execve 从 child 调用的排序不会自然终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55463331/

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