我正在尝试编写一个程序,其中子进程和父进程通过文件读写进行通信。父读取一个文件并按1递增,然后子读取并乘以10.此代码有效一次,但是当我将代码放入循环中进行5次计算时,它不起作用。任何帮助,将不胜感激。我正在尝试使用open()
read()
write()
close()
wait()
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
int main(int argc, char **argv)
{
int f;
int f1;
int x;
char buff;
int value = 0;
int i;
for (i = 0; i < 5; i++) {
pid_t pid = fork();
if(pid < 0){
printf("fork failed");
return 1;}
if (pid>0)
{
f = open("input.txt", O_RDWR);
while ((x = read(f, &buff, sizeof(buff))) > 0)
{
write(1, &buff, 1);
}
int value1 = atoi(&buff);
value = value1;
close(f);
//printf("Parent Number Before: %d\n", value);
value++;
char tmp[i];
sprintf(tmp,"%d", value);
//printf("Parent Number After: %s\n", tmp);
f = open("input.txt", O_RDWR | O_TRUNC);
write(f, tmp, strlen(tmp));
close(f);
wait(2);
}
else if (pid == 0)
{
f = open("input.txt", O_RDWR);
while ((x = read(f, &buff, sizeof(buff))) > 0)
{
}
//printf("Buffer: %d\n", buff);
int c = atoi(&buff);
//printf("Child Number Before: %d\n", c);
c = c * 10;
char tmp[i];
sprintf(tmp,"%d", c);
//printf("Child Number After: %d\n",c);
close(f);
f = open("input.txt", O_RDWR | O_TRUNC);
write(f, tmp, strlen(tmp));
close(f);
return 0;
}
}
return(0);
}
期望的输出是
家长:1
孩子:10
家长:11
孩子:110
家长:111
孩子:1110
家长:1111
儿童:11110
家长:11111
儿童:111110
答案 0 :(得分:0)
除了你完成所有工作后发生的wait
之外,你在进程之间没有同步,所以他们会同时读写文件,这很容易导致文件中只有垃圾填充。
您需要使用咨询文件锁(flock(2)
,lockf(3)
或fcntl(2)
与F_SETLK
,F_SETLKW
和F_GETLK
;阅读差异的手册页)或IPC信号量(sem_overview(7)
)
答案 1 :(得分:0)
文件锁定和信号量都不会轻易获得您想要的交替序列。
从概念上讲,您需要在两个进程之间传递“令牌”。无论哪个进程都有令牌可以继续,然后将令牌传递给另一个进程。
可以使用两个不同的信号(USR1和USR2想到的)和信号处理程序来实现这一点。
也可以在进程之间使用管道:每个进程都可以写入管道(而另一个进程在读取时被阻塞)以传递令牌。该解决方案可能需要比信号解决方案更少的编码。