我是linux的新手。我不能让我的脚本工作。我只是猜测,程序在执行tr函数时会被暂停。
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
int pdesc[2];
pipe(pdesc);
int a = fork();
if (a == 0) // child
{
dup2(pdesc[1],1); // chaning std_out to pipes_out
execlp("ls", "ls", "-l", "-a", NULL);
}
else //parent
{
wait();
int file1 = open("file.txt", O_WRONLY|O_CREAT|O_TRUNC,0777);
dup2(pdesc[0], 0); // chaning std_in to pipes_in
dup2(file1, 1); // chaning std_out to file's stream
execlp("tr", "tr", "a-z", "A-Z", NULL);
}
return 0;
}
答案 0 :(得分:6)
经典错误,所以,好问题。
您需要关闭父级和子级中未使用的管道文件描述符。
从管道读取的过程具有(本身)开放管道写入端,因此管道永远不会完全关闭,因此它永远不会提供EOF。
此外,wait(2)
导致死锁,程序不包含<sys/wait.h>
,并且对wait(2)
的调用缺少必需参数。因为shell会等待父级完成而不是子级,所以实际上在这里进行wait(2)
调用会很好。但是在目前的双流程设计中,你无处可去,因为你在父母的execlp(2)
之后无法控制。解决这个问题的一种方法是再次使用父fork(),并让原始PID在循环中等待(2)除外,直到所有子节点都完成为止。
这是一个工作版本,请注意输出文件模式的更改。
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
int pdesc[2];
pipe(pdesc);
int a = fork();
if (a == 0) { // child
dup2(pdesc[1],1); // chaining std_out to pipes_out
close(pdesc[1]);
close(pdesc[0]);
execlp("ls", "ls", "-l", "-a", NULL);
} else { //parent
int file1 = open("file.txt", O_WRONLY|O_CREAT|O_TRUNC, 0644);
dup2(pdesc[0], 0); // chaning std_in to pipes_in
dup2(file1, 1); // chaning std_out to file's stream
close(pdesc[0]);
close(pdesc[1]);
close(file1);
execlp("tr", "tr", "a-z", "A-Z", NULL);
}
return 0;
}