gpt4 book ai didi

c - C 中的父子进程通过公共(public)文件进行通信

转载 作者:行者123 更新时间:2023-11-30 17:28:17 25 4
gpt4 key购买 nike

我正在尝试编写一个程序,让子进程和父进程通过文件读写进行通信。父级读取文件并递增 1,然后子级读取文件并乘以 10。这段代码可以运行一次,但是当我将代码放入循环中进行计算 5 次时,它不起作用。任何帮助,将不胜感激。我正在尝试使用 open() read() write() close() 等待()

#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);
}

期望的输出是

Parent : 1

Child : 10

Parent: 11

Child : 110

Parent : 111

Child : 1110

Parent : 1111

Child : 11110

Parent : 11111

Child : 111110

最佳答案

除了完成所有工作后发生的wait之外,进程之间没有同步,因此它们将同时读取和写入文件,这很容易导致文件中除了垃圾之外什么也没有。

您需要使用咨询文件锁(flock(2)lockf(3)fcntl(2) 以及 F_SETLKF_SETLKWF_GETLK;请阅读手册页了解差异)或 IPC 信号量 (sem_overview(7))

关于c - C 中的父子进程通过公共(public)文件进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26079986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com