我想创建一个简单的程序,即派生,子进程将写入命名管道,而父进程将从命名管道读取并显示。 问题是它进入父级,执行第一个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);
}
}

#1楼 票数:5

您确实应该检查函数调用的返回值是否有错误,尤其是mkfifo()open()

您对wait()调用将导致其当前位置出现问题。 打开FIFO以正常读取块,直到其他进程打开相同的FIFO进行写入为止,反之亦然1 父级正在等待子级终止,而子级正在等待读取器进程(即父级)连接到FIFO。

1-有关将O_NONBLOCK与FIFO一起使用的信息,请参见下面有关open()说明

wait()调用移至父进程退出之前,并将mkfifo()的调用模式更改为0666似乎可以解决您的一些直接问题。

FIFO完成后,最好删除它。

unlink("myfifo");

IEEE Std 1003.1-2004中open()函数文档中

使用O_RDONLY或O_WRONLY设置打开FIFO时:

  • 如果设置了O_NONBLOCK,则只读的open()将立即返回。 如果当前没有进程打开要读取的文件,则仅用于写入的open()将返回错误。

  • 如果清除了O_NONBLOCK,则只读的open()将阻塞调用线程,直到线程打开要写入的文件为止。 仅用于写操作的open()将阻塞调用线程,直到线程打开文件进行读取为止。


以下示例是原始问题中的代码 与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终止程序。

#2楼 票数:3

首先,尝试使用fprintf到stderr而不是printf(到stdout)

stderr是无缓冲的。

然后,您可以分辨出实际打印的内容和未打印的内容。

或至少在等待任何内容之前先添加fflush

  ask by Blitzkr1eg translate from so

未解决问题?本站智能推荐:

1回复

我应该如何等待来自FIFO的子进程的输入

我在使用fifos时遇到问题,我希望父级创建2个fifos,并等待子级将其用户输入的日期,时间和系统日期和时间以及uid以及uid写入到fifo 1中,一旦收到,该父级就必须打开日志文件,并将内容写入日志文件和fifo2。 然后孩子将阅读fifo2并显示结果
1回复

C中的管道/FIFO清除

我有两个进程在通信。 第一个将数据写入管道或 fifo(我都尝试过),第二个读取其中的内容。 发送的数据目前是直接来自传感器的六个浮点数,因此需要经常上传(10Hz)。 问题是读取数据的进程有点“重”,它可能无法足够快地读取。 管道将满,读取将延迟到程序结束。 因为这样的延迟是不能容忍的,所以我可以
1回复

命名管道(fifo)程序不起作用

伙计们! 我正在尝试制作我的第一个使用命名管道或fifo的程序。 客户端向服务器发送正整数。 发送负数时,传输将关闭。 服务器确定发送的最小数量,最大数量,并将两个值发送回客户端。 我遇到的麻烦是,打印的最大值和最小值始终为零,我真的不知道如何解决问题。 这是我到目前为止: cl
1回复

如何通过命名管道(fifo)传输结构的内容?[关闭]

关闭。 这个问题需要细节或清晰。 它目前不接受答案。 想改善这个问题吗? 通过编辑此帖子添加详细信息并澄清
1回复

在FIFO管道为空之前如何使C程序阻塞?

我正在使用命名(FIFO)管道进行IPC,我想协调该程序只能在读取管道的程序读取管道中先前写入的数据时写入管道。 所以我想阻止写入,直到管道为空。 这可能吗? 我可以选择的一个选项是当管道已满时写入功能会阻塞。 但我想这样做的数据量比Linux中的管道大小要少得多。 例如,我希望该程
1回复

命名为PIPE(FIFO)读取C中的文件内容

基本上,我希望我的客户端程序从文件(在命令行输入中指定的文件名/路径)读取数据并将该数据复制到FIFO,并且我希望我的服务器程序从FIFO读取并打印每一行。 例如,如果我想打印/ etc / passwd文本文件的内容,则可以通过以下方式在终端中运行程序: 但是,除了打印任何输出,它只打
1回复

C-创建/写入/读取命名管道

我想创建一个命名管道,然后写入它,然后我想读取它。 这是我的代码: 在我写完一篇文章后,什么都没有发生。 而且没有消息。 我必须用 STRG C 退出程序。有人知道出了什么问题吗? 我必须使用函数 mkfifo、fopen、fprintf、fgets 和 fclose。 如果我可以将它们保留在代码中
1回复

命名管道,使用Fork()

我遇到了一个很大的问题。 因此,对于我的作业,我必须使用命名管道 (FIFO) 并使用 Fork()。 我有三个程序,lab6(这是我的主要/父母/打印答案)然后我有我的生命支持(这是一个孩子)然后我有我的导航(这也是一个孩子)。 两个孩子必须写信给父母,父母会阅读并打印出来。 真的很难解释答案应该