c - fork() 没有做我想要的

标签 c unix concurrency synchronization fork

所以,我的程序应该这样做:我在父进程中向文件“vaterkind”写入一条消息,然后用子进程读取它,将其写入字符串并将其放在屏幕上。我尝试使用以下代码:

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

int main()
{
    FILE *vaterkind, *kindvater;

    char path1[]={"/home/user/Documents/vaterkind"}, path2[]={"/home/user/Documents/kindvater"}; //paths to files

    int ret, readyv=0, readyk=0;

    mkfifo(path1,0666); //makes fifos
    mkfifo(path2,0666);

    ret = fork();

    if(ret > 0) //parent
    {
        char data_in[50];
        char data_out[50];

        puts("String");
        gets(data_in);
        vaterkind = open(path1,O_WRONLY); //dad is able to write
        kindvater = open(path2,O_RDONLY); //child is able to read

        write(vaterkind,data_in,strlen(data_in)); //write input in vaterkind
        puts("String sent");

        readyv = 1;             // set ready

    }

    else if(ret == 0)           // child
    {
        char data[50],hex[50],ascii[50];
        int i = 0, j = 0;

        vaterkind = open(path1,O_RDONLY); //dad is able to read
        kindvater = open(path2,O_WRONLY); //child is able to write

        read(vaterkind,data,strlen(data)); //read input and write to data

        puts(data);

        puts("Child finished");
        return 0;

    }

    else
    {
        puts("Fork failed");
    }

    sleep(1);
    return 0;

}

但是当我启动程序时,我首先收到消息“String”,然后是一个符号(不知道为什么这里有一个符号),然后是“Child finish”,然后我可以从父级获取消息,然后“String sent” “它看起来像这样:

String

Child finished
input
String sent

有人可以帮忙吗?

最佳答案

在子分支中

char data[50];
...
read(vaterkind,data,strlen(data))

此时 data 包含垃圾,对其应用 strlen 根本没有任何意义。

(这甚至没有提到父级发送一个没有零终止符的字符串,并且子级从不费心以零终止它收到的内容。)

您应该开发某种通信协议(protocol),以确保子进程在任何时候都知道应该从 FIFO 读取多少字节。例如,父级可以首先发送字符串的长度,然后才发送字符串的内容。 child 从阅读长度开始,然后从那里继续。

关于c - fork() 没有做我想要的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40091734/

相关文章:

java - 如何保持线程执行直到异步线程返回回调

c - 递归查找数组的最大元素

c - 需要对此进行一些澄清

C - 较小素数的递归函数

c++ - malloc 的奇怪问题

linux - 如何访问一些邮件,并打印特定邮件的邮件正文?

linux - 我应该对同一文件上的并行 sed 执行进行竞争条件检查吗?如果是,那么如何锁定文件

Java 线程 : Figure out which threads are still running

linux - 如何通过给定的 View 路径获取 ClearCase 流名称?

asynchronous - Singleton EJB 异步方法 (LockType.Write) 阻塞直到方法处理,或者它会在将控制权返回给客户端后立即释放锁?