c - C 中的管道通信

标签 c process pipe

我一直在管道方面进行更多工作,我想知道是否有一种方法可以使用管道在同一进程中进行读写。这是我的代码:

// Creates 2 pipes per child
    for (i=0; i<atoi(argv[1]); i++) {
        pipe(fd[i]);
    }

    for(i = 0; i < atoi(argv[1]); i++) {
        pid = fork();
        //pipe(fd);
        int r[2];
        int check=0;
        srand(getpid());
        int** Board=build_board(width);
        if(pid < 0) {
            printf("Error");
            exit(1);
        } else if (pid == 0) {
            printf("Child (%d): %d\n", i + 1, getpid());

           // srand(getpid());

            makeMove(Board, 2,r);
            printf("Child R: %d:%d\n", r[0],r[1]);
            display(Board, width, width);

            close(fd[i][0]);

            write(fd[i][1], r, sizeof(r));


         //   play(Board);
            exit(0);
        } else  {
            printf("Parent (%d): %d\n", i + 1, getpid());

            while (1) {

                if (check==0) {

                close(fd[i][1]);
                read(fd[i][0], readbuffer, sizeof(readbuffer));
                printf("Received string: %d:%d\n", readbuffer[0], readbuffer[1]);

                Board[readbuffer[0]][readbuffer[1]]=2;
                puts("Fixed Board");
                display(Board, width, width);
                check=checkVictory(Board);

                if (check!=0) {
                    puts("Winner");
                    display(Board, width, width);
                    break;
                }

                //srand(getpid());
                AI_move(Board,1,2);
                display(Board, width, width);

                }   
            }
            wait(NULL);
        }
    }

我试图在两个进程之间来回发送移动,但是使用我拥有的代码,我从子进程中获得第一个移动,然后父进程只是移动直到获胜。我相信在 parent 搬家后我必须给 child 写信,但我在子进程的顶部关闭了这个能力。我和如何相互沟通,直到找到获胜者以及退出时。

这是一些示例输出:

Parent (1): 17291
Child (1): 17293
Child laced peice at: 7,3
Child R: 7:3
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  B  -  -  -  - 
Received string: 7:3
Fixed Board
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  B  -  -  -  - 
Parent placed peice at: 7,5
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  B  -  R  -  - 
Received string: 7:3
Fixed Board
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  B  -  R  -  - 
Parent placed peice at: 6,5
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 -  -  -  B  -  R  -  - 
Received string: 7:3
Fixed Board
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 -  -  -  B  -  R  -  - 
Parent placed peice at: 7,4
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 -  -  -  B  R  R  -  - 
Received string: 7:3
Fixed Board
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 -  -  -  B  R  R  -  - 
Parent placed peice at: 7,0
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 R  -  -  B  R  R  -  - 
Received string: 7:3
Fixed Board
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 R  -  -  B  R  R  -  - 
Parent placed peice at: 7,2
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 R  -  R  B  R  R  -  - 
Received string: 7:3
Fixed Board
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 R  -  R  B  R  R  -  - 
Parent placed peice at: 6,2
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  R  -  -  R  -  - 
 R  -  R  B  R  R  -  - 
Received string: 7:3
Fixed Board
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  R  -  -  R  -  - 
 R  -  R  B  R  R  -  - 
Parent placed peice at: 5,5
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 -  -  R  -  -  R  -  - 
 R  -  R  B  R  R  -  - 
Received string: 7:3
Fixed Board
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 -  -  R  -  -  R  -  - 
 R  -  R  B  R  R  -  - 
Parent placed peice at: 4,5
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 -  -  -  -  -  R  -  - 
 -  -  R  -  -  R  -  - 
 R  -  R  B  R  R  -  - 
Received string: 7:3
Fixed Board
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 -  -  -  -  -  R  -  - 
 -  -  R  -  -  R  -  - 
 R  -  R  B  R  R  -  - 
Winner
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  -  -  - 
 -  -  -  -  -  R  -  - 
 -  -  -  -  -  R  -  - 
 -  -  R  -  -  R  -  - 
 R  -  R  B  R  R  -  - 

最佳答案

以下是一些代码的概要,大致说明了我的实现方式。我假设这两个玩家将是父进程和子进程;我不确定两个 child 如何与 parent 一起工作。

#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

static void err_exit(const char *, ...);
static void be_childish(int fd_in, int fd_out);
static void be_parental(int fd_in, int fd_out);

int main(void)
{
    pid_t pid;
    int to_child[2];
    int to_parent[2];

    if (pipe(to_child) != 0 || pipe(to_parent) != 0)
        err_exit("Failed to open pipe");
    if ((pid = fork()) < 0)
        err_exit("Failed to fork");

    if (pid == 0)
    {
        close(to_child[1]);
        close(to_parent[0]);
        be_childish(to_child[0], to_parent[1]);
    }
    else
    {  
        close(to_child[0]);
        close(to_parent[1]);
        be_parental(to_parent[0], to_child[1]);
    }
    return(0);
}

static void be_childish(int fd_in, int fd_out)
{
    srand(getpid());
    char buffer[32];
    ssize_t nbytes;

    while ((nbytes = read(fd_in, buffer, sizeof(buffer))) > 0)
    {
        /* Process parent's move from buffer */
        /* Write child's move to buffer */
        nbytes = strlen(buffer);
        if (write(fd_out, buffer, nbytes) != nbytes)
            err_exit("Short write from child to parent");
    }
}

static void be_parental(int fd_in, int fd_out)
{
    srand(getpid());
    char buffer[32];
    ssize_t nbytes;

    /* Determine first move */
    nbytes = strlen(buffer);

    if (write(fd_out, buffer, nbytes) != nbytes)
        err_exit("Short write from parent to child");
    while ((nbytes = read(fd_in, buffer, sizeof(buffer))) > 0)
    {
        /* Process child's move from buffer */
        /* Write parent's move to buffer */
        nbytes = strlen(buffer);
        if (write(fd_out, buffer, nbytes) != nbytes)
            err_exit("Short write from parent to child");
    }
}

static void err_exit(const char *fmt, ...)
{
    int errnum = errno;
    va_list args;
    va_start(args, fmt);
    vfprintf(stderr, fmt, args);
    va_end(args);
    if (errnum != 0)
        fprintf(stderr, " (%d: %s)", errnum, strerror(errnum));
    putc('\n', stderr);
    exit(1);
}

err_exit() 函数简化了错误报告——通常在报告错误的地方只需要一行。您可以在主题上使用无数的变体,但是拥有这样的函数可以极大地简化错误检查。

关于c - C 中的管道通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15192956/

相关文章:

java - 使用 bufferreader 在 java 代码中读取 --traceroute 命令时搜索特定单词

grep - alpine 与 ubuntu 上 nc 管道 grep 的不同行为

linux管道如何退后一步打印值

bash - 在 C 中处理 Ubuntu shell 中的特定管道命令

c - 如何重新加载 gdbinit?

python - Python 中的 C func 中的浮点变量格式不正确

c - 如何在函数中打印出大于9?

c - 为什么这是无效的 C 代码?

java - 避免调度执行器创建 java 进程的多个实例

linux - 在 Linux 哈希表中插入 PID