通过公共文件在C中进行父子进程通信

时间:2014-09-27 23:01:58

标签: c linux unix

我正在尝试编写一个程序,其中子进程和父进程通过文件读写进行通信。父读取一个文件并按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

2 个答案:

答案 0 :(得分:0)

除了你完成所有工作后发生的wait之外,你在进程之间没有同步,所以他们会同时读写文件,这很容易导致文件中只有垃圾填充。

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

答案 1 :(得分:0)

文件锁定和信号量都不会轻易获得您想要的交替序列。

从概念上讲,您需要在两个进程之间传递“令牌”。无论哪个进程都有令牌可以继续,然后将令牌传递给另一个进程。

可以使用两个不同的信号(USR1和USR2想到的)和信号处理程序来实现这一点。

也可以在进程之间使用管道:每个进程都可以写入管道(而另一个进程在读取时被阻塞)以传递令牌。该解决方案可能需要比信号解决方案更少的编码。