C语言 同步管道访问以进行双向读/写



我有一段遗留代码,我将某些逻辑委托给子进程。要求是父级写入管道,子级读取管道。阅读后,孩子向新管道写入一些内容,父母从中读取。

在下面的代码中,函数 send(( 由父进程中的专用线程定期调用。

LaunchWorker(( 确保子进程仅在第一次调用时分叉。

1(我无法弄清楚如何关闭两个描述符的读写端,以便在每次写入时刷新写入管道的旧数据。2( 两个描述符也需要两次调用 pipe(( 吗?

任何使此代码工作的输入将不胜感激。谢谢!

typedef struct
{
    WebClient* wc; // user defined class
    string url;
    string data;
    size_t dataLen;
    DownloadObserver* downloadCallback; // user defined class
    string* token;
}Payload;
PayLoad pl;
static pid_t worker_pid = 0;
int fd1[2];
int fd2[2];
bool done = false;
void LaunchWorker()
{
    if (worker_pid != 0)
    {
        return;
    }
    pipe(fd1);
    pipe(fd2);
    worker_pid = fork();
}
void send()
{
    //populate pl;
    LaunchWorker();
    if (worker_pid == 0)
    {
        while(true)
        {
            close(fd1[1]);
            close(fd2[0]);
            int cr = read(fd1[0], &pl, sizeof(Payload));
            if (cr > 0)
            {
                // Upload some data to a remote http endpoint - uses libcurl
                //if upload success, done = true
                int cw = write(fd2[1], &done, sizeof(bool));
                if (cw > 0)
                {
                    // success
                }
                else
                {
                    // failure
                }
            }
            else
            {
                // failure
            }
        }
    }
    else if (workper_pid > 0)
    {
        close(fd1[0]);
        close(fd2[1]);
        int pw = write(fd1[1], &pl, sizeof(Payload));
        if (pw > 0)
        {
            int pr = read(fd2[0], &done, sizeof(bool));
            if (pr > 0) 
            {
                // do something with value read
            }
            else
            {
                // failure
            }
        }
        else
        {
            failure
        }
    }
}

首先,您需要在分叉后立即关闭管道的未使用端,因此父级应关闭 fd1 的读取端和 fd2 的写入端,子级应关闭 fd1 的写端和 fd2 的读取端。如果不这样做,则完成后管道将不会关闭。

然后,当你想停止一切时,我会让每个管道的编写器关闭管道的写入端。

  • 父级关闭 FD1 的写入结束
  • 孩子在 FD1 上读取 EOF 并关闭它
  • 子项关闭 FD2 的写入端
  • 父级读取 FD2 上的 EOF 并将其关闭。

或者相反,如果孩子开始关闭。

最后,父进程应发出wait系统调用以收集子进程的退出结果。

是的,您确实需要两个管道。管道是一种方式。

最新更新