c - Linux从文件中读取奇怪的行为

标签 c linux unix signals

我正在尝试编写一个程序来创建一个文件,将 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/

相关文章:

c - 了解堆栈分配和对齐

c - readdir() 是否保证订单?

c - 即使缓冲区大小不同,数据是否在 UDP 中成功传输?

Java KeyListener 重获焦点后不监听

c - 默认写入行为-O_TRUNC或O_APPEND?

c - strtok函数c解释

mysql连接配置文件配置文件

ruby - 查看 USB 设备是否已连接。 Linux 中的 ruby

java.lang.运行时异常 "Cannot run program"

linux - 发送十二个数据包后 PF_UNIX 套接字阻塞