我的under-linux c prog出了什么问题:“ls -al | tr a-z A-Z> file.txt“?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了我的under-linux c prog出了什么问题:“ls -al | tr a-z A-Z> file.txt“?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1596字,纯文字阅读大概需要3分钟。
内容图文
![我的under-linux c prog出了什么问题:“ls -al | tr a-z A-Z> file.txt“?](/upload/InfoBanner/zyjiaocheng/969/f25211789db14572a16f4a4cafec4bd2.jpg)
我是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;
}
解决方法:
经典错误,所以,好问题.
您需要关闭父级和子级中未使用的管道文件描述符.
从管道读取的过程具有(本身)开放管道写入端,因此管道永远不会完全关闭,因此它永远不会提供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;
}
内容总结
以上是互联网集市为您收集整理的我的under-linux c prog出了什么问题:“ls -al | tr a-z A-Z> file.txt“?全部内容,希望文章能够帮你解决我的under-linux c prog出了什么问题:“ls -al | tr a-z A-Z> file.txt“?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。