c - 我的 fork fifo c 代码不能正常工作

标签 c linux process fork fifo

我在使用以下代码时遇到问题。我正在做一个关于使用 fork (创建进程)的实验室作业。这是一个简单的程序,应该从键盘读取输入,然后将其读/写到 fifo 并显示其内容和写入的字节。

当我运行它时,一切似乎都很好,直到我输入一些文本。父打印消息显示正常,但子打印消息从未显示,直到我输入第二条消息,它总是说它写了 80 个字节,即使我知道它没有,还有一堆奇怪的到处都是特殊字符。

这是程序应该如何运行的可执行文件: Linux:http://www.mediafire.com/?6806v24q6lz7dpc QNX:http://www.mediafire.com/?a9dhiwmrlx2ktkp

到目前为止我的代码:

#include<stdio.h>
#include<stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char *argv[]) {

    char FifoName[] = "fifoDan";
    int fd;
    pid_t retval;
    int size_read;
    char buff[80];
    int  size_written;

    mknod(FifoName, S_IFIFO | 0666, 0);

     // Check if its not equal to zero (ie: child process = 0)
     if (retval = fork ()) {

             printf ("Parent: Waiting for writers \n");

             if(fd = open(FifoName, O_RDONLY) == -1) {
                            perror( "Could not read the FIFO" );
                    return EXIT_FAILURE;
             }

             printf ("Parent: Received a writer \n");

             do {

                             int strsize;

                             size_read = read(fd, buff, sizeof(buff));

                             printf("Parent: read %d bytes: %s \n", size_read, buff);
                             fflush(stdout);

                            strsize = strlen(buff);

                             //   put a '\0' at the end of the data
                            buff[strsize] = '\0';


                     } while(size_read > 0);


                    close(fd);
                    waitpid(retval, NULL, NULL);

                    if(unlink(FifoName) != -1) {
                            return EXIT_SUCCESS;
                    } else {
                            return EXIT_FAILURE;
                    }


    } else {


      printf ("Child pid %d waiting for readers \n", getpid ());
      fflush(stdout);

       if(fd = open(FifoName, O_WRONLY) == -1) {
                            perror( "Could not read the FIFO" );
                    return EXIT_FAILURE;
            }

      printf ("Child: Got a reader, enter some stuff:\n");
      fflush(stdout);

      while(fgets(buff, 80, stdin) != NULL) {

                     int strsize;

                     strsize = strlen(buff);

                     if(strsize < 80) {
                             buff[strsize] = '\0';
                     }

                    size_written = write(fd, buff, sizeof(buff));

                    printf ("Child: wrote %d bytes \n", size_written);
                    fflush(stdout);

             }

             close(fd);

    }


}

最佳答案

这一行(例如)不会按照您的想法行事:

if(fd = open(FifoName, O_WRONLY) == -1)

相等运算符具有更高的precedence而不是赋值运算符,所以你所做的实际上是这样的:

if(fd = (open(FifoName, O_WRONLY) == -1))

当你想要这个:

if((fd = open(FifoName, O_WRONLY)) == -1)

缓冲区读/写的问题是因为你写了整个缓冲区:

size_written = write(fd, buff, sizeof(buff));

改为使用 strsize 改为仅写入实际字符串。

关于c - 我的 fork fifo c 代码不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14745515/

相关文章:

Java 进程流

process - 为什么 I/O 绑定(bind)进程更快?

c - 传递结构指针会无缘无故地导致整数溢出

c - 指针算术在数组外是否仍然有效?

c - 使用函数返回值而不先存储它 - 为什么这种情况很少见?

python - 为什么从 python 调用 shopt 会失败?

c - 从 FIFO 读取的程序是否有任何方法可以检测到写入同一 FIFO 的程序已将其关闭?

c - 怎样才能正确减法呢?

linux - "cpu/mem-loads/pp"和 "cpu/mem-loads/"有什么区别?

C++ Windows CreateChildProcess - 隐藏/不显示子进程的控制台窗口