C:unix套接字->;断管

C:unix套接字->;断管,c,sockets,unix,C,Sockets,Unix,我试图让套接字在C代码中工作,而不是调用命令行find 通过管道传输到child2函数“cut”的child3“sort”函数工作正常,当执行所有3个子函数时,程序会卡在父进程waitpid()中 我试图隔离参与套接字的唯一孩子,当我在gdb上运行可执行文件时,我得到消息“find:‘standard output’:break pipe”和“find:write error” 下面是两个子函数与套接字交互的示例: 儿童1: 和儿童2: void child2(int *pipe_fd) {

我试图让套接字在C代码中工作,而不是调用命令行find

通过管道传输到child2函数“cut”的child3“sort”函数工作正常,当执行所有3个子函数时,程序会卡在父进程waitpid()中

我试图隔离参与套接字的唯一孩子,当我在gdb上运行可执行文件时,我得到消息“find:‘standard output’:break pipe”和“find:write error”

下面是两个子函数与套接字交互的示例: 儿童1:

和儿童2:

void child2(int *pipe_fd)
{
    int sock;
    struct sockaddr_un local, remote;
    socklen_t sock_size = (socklen_t)sizeof(remote);

    sock= socket(AF_UNIX, SOCK_STREAM, 0);

    memset(&local, 0, sizeof(struct sockaddr_un));
    memset(&remote, 0, sizeof(struct sockaddr_un));

    local.sun_family = AF_UNIX;
    strncpy(local.sun_path, "socket", sizeof(local.sun_path) - 1);
    unlink("socket");
    bind(sock, (struct sockaddr *)&local, sizeof(struct sockaddr_un));

    listen(sock, 1);
    sock = accept(sock,(struct sockaddr *)&remote, &sock_size));
    dup2(sock, STDOUT_FILENO);
    close(sock);

    close(pipe_fd[0]);
    dup2(pipe_fd[1],1);
    close(pipe_fd[1]); 
    execlp("cut", "cut", "-d", " ", "-f", "3-", NULL);
}
没有必要具体解决这个问题,我只是想了解我在创作过程中做错了什么,这样我以后就不会再做了。 如果我更改了dup2(sock,STDOUT\u FILENO),我将提前感谢您的帮助。

进入
dup2(sock,标准文件号)
child2
中(输入是sock,输出是通向
child3
的管道),您的示例基本上可以工作:

(需要进行错误检查)


其中,第一个
|
不是常规管道,而是通过
“socket”

的UNIX套接字连接,两个子节点都在向同一套接字写入数据。这真的是你想要的吗?
child2
从不执行任何操作。为什么
child2
要将stdout连接到套接字?它不应该是读卡器吗?如果在读取过程关闭套接字后尝试写入套接字,就会出现“断管”。读取过程在哪里?如果
}
是child2的结尾,那么
查找
输出(莫名其妙地复制到STDOUT_FILENO)的接收器将在那里隐式关闭,这将断开child1的套接字。谢谢!我真的需要下定决心检查这些错误。
void child2(int *pipe_fd)
{
    int sock;
    struct sockaddr_un local, remote;
    socklen_t sock_size = (socklen_t)sizeof(remote);

    sock= socket(AF_UNIX, SOCK_STREAM, 0);

    memset(&local, 0, sizeof(struct sockaddr_un));
    memset(&remote, 0, sizeof(struct sockaddr_un));

    local.sun_family = AF_UNIX;
    strncpy(local.sun_path, "socket", sizeof(local.sun_path) - 1);
    unlink("socket");
    bind(sock, (struct sockaddr *)&local, sizeof(struct sockaddr_un));

    listen(sock, 1);
    sock = accept(sock,(struct sockaddr *)&remote, &sock_size));
    dup2(sock, STDOUT_FILENO);
    close(sock);

    close(pipe_fd[0]);
    dup2(pipe_fd[1],1);
    close(pipe_fd[1]); 
    execlp("cut", "cut", "-d", " ", "-f", "3-", NULL);
}
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/un.h>
#include <sys/wait.h>
void child1()
{
    int sock;
    struct sockaddr_un  remote;

    sock = socket(AF_UNIX, SOCK_STREAM, 0);
    memset(&remote, 0, sizeof(struct sockaddr_un));
    remote.sun_family = AF_UNIX;
    strncpy(remote.sun_path, "socket", sizeof(remote.sun_path) - 1);

    while((connect(sock, (struct sockaddr *)&remote,   (socklen_t)sizeof(remote))) == -1)
    {
        perror("connect");
        if(errno != ENOENT && errno != ECONNREFUSED)
            perror("child 2 failed to connect to socket");
    }
    dup2(sock, 1);
    close(sock);
    execlp("find", "find", ".", "-type" , "f", "-ls", (char*)0);
}
void child2(int *pipe_fd)
{
    int sock;
    struct sockaddr_un local, remote;
    socklen_t sock_size = (socklen_t)sizeof(remote);

    sock= socket(AF_UNIX, SOCK_STREAM, 0);

    memset(&local, 0, sizeof(struct sockaddr_un));
    memset(&remote, 0, sizeof(struct sockaddr_un));

    local.sun_family = AF_UNIX;
    strncpy(local.sun_path, "socket", sizeof(local.sun_path) - 1);
    unlink("socket");
    bind(sock, (struct sockaddr *)&local, sizeof(struct sockaddr_un));

    listen(sock, 1);
    puts("listened");
    sock = accept(sock,(struct sockaddr *)&remote, &sock_size);
    dup2(sock, STDIN_FILENO);
    close(sock);

    close(pipe_fd[0]);
    dup2(pipe_fd[1],1);
    close(pipe_fd[1]); 
    execlp("cut", "cut", "-d", " ", "-f", "3-", (char*)0);
}
void child3(int *pipe_fd)
{
    dup2(pipe_fd[0],0);
    close(pipe_fd[0]);
    execlp("sort", "sort", (char*)0);
}

int main()
{
    int pi[2];
    pid_t pid0, pid1, pid2;
    pid0 = fork();
    if (0==pid0){
        child1();
        _exit(1);
    }
    pipe(pi);
    pid1 = fork();
    if(0==pid1){
        child2(pi);
        _exit(1);
    }
    close(pi[1]);
    pid2 = fork();
    if(0==pid2){
        child3(pi);
        _exit(1);
    }
    close(pi[0]);

    wait(0);
    wait(0);
    wait(0);
}
find | cut | sort