gpt4 book ai didi

c - 使用 bash 脚本 fork exec 和管道

转载 作者:行者123 更新时间:2023-11-30 15:08:42 27 4
gpt4 key购买 nike

我想将 bash 脚本 (sc.sh) 的输出(该脚本与该程序位于同一目录中并且包含下面的行)放入 C 程序的输入( cprog);执行 cprog 可以工作,但我不知道为什么 bash 脚本没有启动:

timeout 5 cat /dev/urandom

这是主程序:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char* argv[])
{
int fd[2];
pid_t pid1, pid2;
char * input[] = {"/bin/bash", "sc.sh", argv[1], NULL};
char * output[] = {"./cprog", argv[1], NULL};

pipe(fd);

pid1 = fork();
if (pid1 == 0) {
dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
execv(input[0], input);
return 1;
}

pid2 = fork();
if (pid2 == 0) {
dup2(fd[0], STDIN_FILENO);
close(fd[1]);
execv(output[0], output);
return 1;
}

close(fd[0]);
close(fd[1]);
waitpid(pid1, NULL, WNOHANG);
waitpid(pid2, NULL, WNOHANG);
return 0;
}

最佳答案

我修改了你的程序以报告错误并实际上等待 children 死亡,如下所示:

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

int main(int argc, char* argv[])
{
if (argc > 2)
fprintf(stderr, "Excess arguments ignored\n");
int fd[2];
pid_t pid1, pid2;
char * input[] = {"/bin/bash", "sc.sh", argv[1], NULL};
char * output[] = {"./cprog", argv[1], NULL};

pipe(fd);

pid1 = fork();
if (pid1 == 0) {
dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
execv(input[0], input);
perror(input[0]);
return 1;
}

pid2 = fork();
if (pid2 == 0) {
dup2(fd[0], STDIN_FILENO);
close(fd[0]);
close(fd[1]);
execv(output[0], output);
perror(output[0]);
return 1;
}

close(fd[0]);
close(fd[1]);
int status1;
int corpse1 = waitpid(pid1, &status1, 0);
printf("PID %d: %d (0x%.4X)\n", pid1, corpse1, status1);
int status2;
int corpse2 = waitpid(pid2, &status2, 0);
printf("PID %d: %d (0x%.4X)\n", pid2, corpse2, status2);
return 0;
}

我使用了一个简单的 C 程序作为 cprog:

#include <stdio.h>

int main(void)
{
int c;
unsigned sum = 0;
unsigned cnt = 0;
while ((c = getchar()) != EOF)
sum += c, cnt++;
printf("sum of bytes: %u\n", sum);
printf("num of bytes: %u\n", cnt);
return 0;
}

在命令行上进行测试得出:

$ bash sc.sh | cprog
sum of bytes: 325895667
num of bytes: 69926912
$

运行主程序(它是从 p19.c 创建的 p19),结果是:

$ ./p19
sum of bytes: 372818733
num of bytes: 70303744
PID 28575: 28575 (0x7C00)
PID 28576: 28576 (0x0000)
$

退出状态显示超时以状态124退出,这是GNU文档中命令超时时的退出状态。

因此,在我重现您的环境时,您提供的代码可以正常工作。这表明您的环境并未按照您的想法设置。也许 sc.sh 脚本不存在。

关于c - 使用 bash 脚本 fork exec 和管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37188842/

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