我需要编写一个程序,创建管道发送文件名从命令行到子进程。在孩子读取该文件并使用管道将其发回。父进程应该打印文件。如果在子进程中发生错误,必须将错误发送给父进程。程序读取文件并将其发送到父进程与管道
这里是我的代码,它沿着文件文件打印一些垃圾(当它运行时它也禁用终端模拟器中的滚动)。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void main(int argc, char *argv[]) {
int pipefd[2];
char buff[100];
int childpid;
int size;
FILE *file;
if (argc != 2) {
printf("usage:\n%s <filename>\n", argv[0]);
exit(1);
}
if (pipe(pipefd) < 0) {
perror("can't open pipe\n");
}
if ((childpid = fork()) == 0) {
sleep(1);
size = read(pipefd[0], buff, sizeof(buff));
file = fopen(buff, "r");
if (file == NULL) {
write(pipefd[1], "Can't open file", 15);
exit(1);
}
while (!feof(file)) {
if (fgets(buff, sizeof(buff), file) == NULL) {
write(pipefd[1], "Error reading file", 18);
} else {
write(pipefd[1], buff, sizeof(buff));
}
}
} else if (childpid > 0) {
size = strlen(argv[1]);
if (write(pipefd[1], argv[1], size) != size) {
perror("Error writing to pipe\n");
}
wait(NULL);
while ((size = read(pipefd[0], buff, sizeof(buff))) > 0) {
write(1, buff, size);
}
}
exit(0);
}
它应该是'int main(int argc,char * argv [])''。 – 2012-04-13 10:55:52
你能告诉我们你面临什么问题吗? – 2012-04-13 10:55:56
如果文件足够大,则会导致死锁;父母等待孩子死亡,但孩子可能会等待父母读取管道。你假设双向管道;这些还不是标准的(尽管它们在Linux上是可用的,我相信)。当它完成写入时,你的父进程应该关闭其管道的写入端;可以说,孩子在完成阅读后应该关闭阅读器的读取端。 – 2012-04-13 10:59:57