名为C管(FIFO)。 父进程卡住(C Named pipe (fifo). Parent pr

2019-09-28 02:55发布

我想打一个简单的程序,即叉,和孩子写入命名管道和家长从命名管道读取并显示。 问题是,它进入母体,确实第一个printf,然后会很奇怪,它不会做任何事情,没有得到第二个printf,它只是在控制台输入方式。

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void main()
{
char t[100];
mkfifo("myfifo",777);
pid_t pid;
pid = fork();
if (pid==0)
{
    //execl("fifo2","fifo2",(char*)0);
    char r[100];
    printf("scrie2->");
    scanf("%s",r);

    int fp;
    fp = open("myfifo",O_WRONLY);
    write(fp,r,99);
    close(fp);
    printf("exit kid \n");
    exit(0);
} else
{
    wait(0);
    printf("entered parent \n"); // <- this it prints
    // whats below this line apparently its not being executed
    int fz; printf("1"); 
    fz = open("myfifo",O_RDONLY); printf("2");
    printf("fd: %d",fz);
    char p[100];
    int size;
    printf("------");
    //struct stat *info;
    //stat("myfifo",info); printf("%d",(*info).st_size);
    read(fz,p,99);
    close(fz);
    printf("%s",p);

    printf("exit"); exit(0);
}
}

Answer 1:

你真的应该检查对函数的返回值的误差要求,特别是mkfifo()open()

您的来电wait()将会导致其当前位置的问题。 打开一个FIFO为直到其他进程打开用于写入的同一FIFO,反之亦然1读取正常块。 家长正在等待孩子终止,孩子正在等待读取器进程,即父,连接到FIFO。

1 -参见附注上open()下面是一个用O_NONBLOCK与FIFO

移动wait()调用父进程与呼叫模式更改为退出一起之前mkfifo()0666 ,似乎解决您的一些眼前的问题。

这也是很好的做法,当你用它完成去除FIFO。

unlink("myfifo");

open() IEEE标准1003.1-2004函数文档 :

当用户打开带有O_RDONLY一个FIFO或O_WRONLY设置:

  • 如果设置了O_NONBLOCK,开放的()用于读只应毫不迟延地返回。 一个开放的()写入,只应返回一个错误,如果没有进程当前打开文件进行读取。

  • 如果O_NONBLOCK是清楚的,一个开放的()读取只有等到一个线程打开文件进行写入应阻止调用线程。 一个开放的()写入,只有等到一个线程打开文件进行读取应阻塞调用线程。


下面的例子是组合在你原来的问题代码和的Beej指南的Unix IPC FIFO页 :

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

#define FIFO_NAME "myfifo"

int main(void)
{
    char buf[256];
    int num, fd;
    pid_t pid;

    if (mkfifo(FIFO_NAME, 0666) < 0)
        perror("mkfifo");

    pid = fork();
    if (pid == 0)
    {
        printf("child - waiting for readers...\n");
        if ((fd = open(FIFO_NAME, O_WRONLY)) < 0)
            perror("child - open");

        printf("child - got a reader -- type some stuff\n");
        while (fgets(buf, sizeof(buf), stdin), !feof(stdin))
        {
            if ((num = write(fd, buf, strlen(buf))) < 0)
                perror("child - write");
            else
                printf("child - wrote %d bytes\n", num);
        }

        close(fd);
        exit(0);
    }
    else
    {
        printf("parent - waiting for writers...\n");
        if ((fd = open(FIFO_NAME, O_RDONLY)) < 0)
            perror("parent - open");

        printf("parent - got a writer\n");
        do
        {
            if ((num = read(fd, buf, sizeof(buf))) < 0)
                perror("parent - read");
            else
            {
                buf[num] = '\0';
                printf("parent - read %d bytes: \"%s\"\n", num, buf);
            }
        } while (num > 0);

        close(fd);
        wait(0);
    }

    unlink(FIFO_NAME);
    return 0;
}

这个例子在Linux中进行了测试。 按Ctrl - d终止程序。



Answer 2:

首先,尝试改为fprintf中到stderr的printf(到stdout)

标准错误是无缓冲。

那么你可以告诉什么是真正获取打印,哪些没有。

或者至少加fflush等待任何东西之前。



文章来源: C Named pipe (fifo). Parent process gets stuck
标签: c fork pipe fifo