c - 如何使用 fork 将多条记录从 parent 传递给 child

标签 c pipe fork

我想做的是,我有一个父子进程。我尝试读取文件并将所有内容传递给 child 。输入文件中有记录。我必须一次阅读一次并传给 child 。但不管我做什么。 child 只读取第一个记录,而不是所有其他记录。我测试了我的方法从输入文件中获取所有记录但不能将它们全部写入 child 。请有任何想法。

struct product_record {
    int idnumber;            // Unique identification
    char name[PRODUCTSIZE];  // String description
    double price;            // Unit cost
};

int pid, mypipe[2], status;

int main(int argc, char **argv) 
{ 
    int result;     
    result = pipe(mypipe);//create pipes    
    if (result < 0) {
       perror("pipe creation error");//failure in creating a pipe
       exit (1);    
    }//if

    if ((pid = fork()) == 0)
    {
        read(mypipe[0], &product, sizeof(product));
        exit(0);
    } 
    else if (pid == -1) 
    {
         cout << "Fork failed" << endl;
         exit(1);
    } 
    else 
    {//parent
        parentReadsFromTheFile(argv);//argv inputfile name
        wait(&status);
    }   
    return 0;//Return to the OS.
}//main

void parentReadsFromTheFile(char **args) 
{
    while (getline(inputFile, line)) //read a line till EOF
    {
        //put read record into product
        write(mypipe[1], &product, sizeof(product));//Write to pipe
    }
}

最佳答案

您可以通过管道将数据从一个进程传输到另一个进程,但此数据必须仅包含标量信息:您不能以这种方式传输地址或指针。

我怀疑您的 product 对象不是只有数字和字符的简单结构。

从您为 product 发布的类型,可以通过这种方式传输此类型。

重新阅读你的代码,我看到 child 只读了一条记录:

if ((pid = fork()) == 0) {
    read(mypipe[0], &product, sizeof(product));
    exit(0);
} 

你写:无论我做什么。 child 只阅读第一条记录,而不是所有其他记录。,但这正是您所做的!

事实上,请注意 read 在某些您应该支持的情况下可能会返回一个短计数,但在当前情况下,您只尝试读取单个结构并退出过程。父级进一步写入管道将失败。

关于c - 如何使用 fork 将多条记录从 parent 传递给 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35832069/

相关文章:

python - Linux 管道读完但想丢弃其余部分

c - 使用管道进行 IPC

c - 让 children 等待直到收到 parent 的信号

c - 为什么在函数外部声明时数组大小参数不能是变量?

c - 将地址传递给函数,修改后值没有改变

C 文件试图覆盖

`read()` 后面可以直接跟 `write()` 吗? `write()` 后面可以直接跟 `read()` 吗?

c - 这个 IF 语句中的语句是如何工作的?

C fork - 如何在开始工作负载之前等待所有子进程?

c - mvaddch() 不打印到控制台