我正在尝试编写一个程序来创建一个文件,将 0 写入其中,然后使用子进程交替增加该值。例如,子进程应将该值增加到 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/