gpt4 book ai didi

c - 在 C 中使用管道和 fork 重定向标准输出

转载 作者:行者123 更新时间:2023-11-30 15:49:37 24 4
gpt4 key购买 nike

我有一个关于 ptrace 和管道的练习。以下代码是整个程序的一部分。管道在主要部分之前创建,并且 this_trace.s_out 为 1。主要父亲创建子项,该子项为 stdout 创建自己的子项。当程序运行 ls 时,它会打印在屏幕上,不会写入文件中。怎么了?

if(pid == 0)
{
char buf0[BUFFSIZE], buf1[BUFFSIZE], buf2[BUFFSIZE];
int length0, length1, length2;


if(this_trace.s_out == 1) //For stdout redirection
{
if((pid1=fork()) == -1)
{
perror("fork");
exit(1);
}

if(pid1 == 0) //child for stdout redirect
{//sleep(2);
if(fd1 = open(this_trace.out_name,O_WRONLY | O_CREAT | O_TRUNC, 0666) == -1)
{
perror("create stdout file");
exit(1);
}


close(p_out[WRITE]);
close(p_in[READ]);
close(p_in[WRITE]);
close(p_err[READ]);
close(p_err[WRITE]);

do{
if((length1 = read(p_out[READ],buf1,BUFFSIZE)) == -1)
{
perror("Read for stdout redirection");
exit(1);
}
write(fd1, buf1, length1);
}while(length1 > 0);


close(fd1);
//close(p_out[READ]);
return 0;
//break;

}
else if(pid1 > 0)//child from main father
{
close(p_out[READ]);
close(p_in[READ]);
close(p_in[WRITE]);
close(p_err[READ]);
close(p_err[WRITE]);

dup2(p_out[WRITE], 1);
}

}




ptrace(PTRACE_TRACEME, 0, NULL, NULL);


//execv(argv[1],NULL);
execl("/bin/ls","ls",NULL);


}

抱歉我的英语不好。

最佳答案

目前尚不清楚为什么有这么多进程。您遇到的问题是:

if (fd1 = open(this_trace.out_name,O_WRONLY | O_CREAT | O_TRUNC, 0666) == -1)

无论打开的文件描述符如何,都会将 0 或 1 分配给 fd1。应该是:

if ((fd1 = open(this_trace.out_name,O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1)

使用dup2()(或dup())将文件描述符重定向到标准 channel 后,您应该关闭原始文件描述符。因此,在 dup2(p_out[WRITE], 1); 之后,您需要 close(p_out[WRITE]);

您应该检测 execl() 的失败并进行处理;如果execl()返回,则失败。

您显示未使用的变量 buf0buf2(以及相应的 length0length2)。

关于c - 在 C 中使用管道和 fork 重定向标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16180837/

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