【发布时间】:2016-10-17 16:51:50
【问题描述】:
所以,我的程序应该这样做:我在父进程中向文件“vaterkind”写入一条消息,然后用子进程读取它,将它写入一个字符串并放在屏幕上。我试过这段代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
int main()
{
FILE *vaterkind, *kindvater;
char path1[]={"/home/user/Documents/vaterkind"}, path2[]={"/home/user/Documents/kindvater"}; //paths to files
int ret, readyv=0, readyk=0;
mkfifo(path1,0666); //makes fifos
mkfifo(path2,0666);
ret = fork();
if(ret > 0) //parent
{
char data_in[50];
char data_out[50];
puts("String");
gets(data_in);
vaterkind = open(path1,O_WRONLY); //dad is able to write
kindvater = open(path2,O_RDONLY); //child is able to read
write(vaterkind,data_in,strlen(data_in)); //write input in vaterkind
puts("String sent");
readyv = 1; // set ready
}
else if(ret == 0) // child
{
char data[50],hex[50],ascii[50];
int i = 0, j = 0;
vaterkind = open(path1,O_RDONLY); //dad is able to read
kindvater = open(path2,O_WRONLY); //child is able to write
read(vaterkind,data,strlen(data)); //read input and write to data
puts(data);
puts("Child finished");
return 0;
}
else
{
puts("Fork failed");
}
sleep(1);
return 0;
}
但是当我启动程序时,我首先收到消息“字符串”,然后是一个符号(不知道为什么这里有一个符号),然后是“孩子完成”,然后我可以从父母那里获取,然后是“发送的字符串" 它看起来像这样:
String
Child finished
input
String sent
有人可以帮忙吗?
【问题讨论】:
-
你在哪里关闭文件?
-
您不需要孩子等到父母写入文件吗?此外,您的任何代码都没有错误检查,因此无法调试。 (如果
open或read或write失败怎么办?你甚至不会知道。)此外,你应该不在父级和孩子。这在过去导致了大量的错误,这些错误已经损害了敏感信息。父母或孩子必须致电_exit终止。 -
我该如何让孩子等待?我尝试了一段时间,但它并没有真正起作用..
标签: c unix concurrency synchronization fork