gpt4 book ai didi

c - Linux 读取文件异常行为

转载 作者:太空狗 更新时间:2023-10-29 11:45:02 27 4
gpt4 key购买 nike

我正在尝试编写一个程序来创建一个文件,将 0 写入其中,然后使用子进程交替递增该值。例如, child 应该将该值递增到 1,并将其写回到文件中。此后,父级将其递增到 2 并将其写入文件。 child 到3岁,依此类推。进程之间的同步是通过信号完成的。这是源代码:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

void sig_hand (int sig);

int fd;

int main()
{
pid_t pid;
int i;
fd = open ("abc.txt",O_RDWR|O_TRUNC);
if (fd == -1)
{
fd = creat ("abc.txt",S_IRUSR|S_IWUSR);
}
write (fd,"0",2);
if ((pid = fork()) < 0)
{
fprintf (stderr, "Error creating process\n");
exit (1);
} else
{
if (pid == 0)
{
signal (SIGUSR1,sig_hand);
for (;;)
{
pause();
kill (getppid(),SIGUSR1);
}
}
if (pid > 0)
{
sleep (1);
signal (SIGUSR1,sig_hand);
for (i=0;i<5;i++)
{
kill (pid,SIGUSR1);
pause ();
}
kill (pid,SIGTERM);
}
}
return 0;
}

void sig_hand (int sig)
{
int x;
char c;
read (fd,&c,2);
x=atoi(&c);
x++;
printf ("x=%d\n",x);
snprintf (&c,3,"%d",x);
lseek (fd,0,SEEK_SET);
printf ("PID %d is writing\n",getpid());
write (fd,&c,2);
}

运行这个程序会产生以下输出:

x=1
PID 4434 is writing
x=1
PID 4433 is writing
x=2
PID 4434 is writing
x=2
PID 4433 is writing
x=3
PID 4434 is writing
x=3
PID 4433 is writing
x=4
PID 4434 is writing
x=4
PID 4433 is writing
x=5
PID 4434 is writing
x=5
PID 4433 is writing

为什么子项和父项在一次迭代中递增相同的值?

谢谢!

最佳答案

问题不在于同步,而在于文件访问。您从文件中读取,回到开头,然后写入文件。您认为下一次阅读将来自哪里?您还需要在每次写入后返回文件的开头。

您也有一些缓冲区溢出,因为您将 char 用作单字符字符串。它不会那样工作,因为您没有空终止符的空间。

关于c - Linux 读取文件异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21067930/

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