【发布时间】:2017-04-14 19:05:04
【问题描述】:
我正在尝试让套接字在 C 代码中工作,而不是调用命令行 find。
通过管道传输到 child2 函数 'cut' 的子 3'sort' 函数工作正常,当执行时包含所有 3 个子函数时,程序会卡在父进程 waitpid() 中。
我试图隔离参与套接字的唯一孩子,当我在 gdb 上运行可执行文件时,我收到消息“find: 'standard output': Broken pipe”和“find: write error”
以下是与套接字交互的两个子函数的示例: 孩子 1:
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)
{
if(errno != ENOENT && errno != ECONNREFUSED)
erro("child 2 failed to connect to socket");
}
dup2(sock, 1);
close(sock);
execlp("find", "find", ".", "-type" , "f", "-ls", NULL);
}
还有孩子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);
}
这个问题没必要专门解决,我只是想了解一下我在创作过程中做错了什么,以后不会再犯了。 我提前感谢任何帮助。
【问题讨论】:
-
两个孩子都在写入同一个套接字。这真的是你想要的吗?
-
child2从不执行任何操作。 -
为什么
child2将标准输出连接到套接字?不应该是读者吗? -
如果您在读取过程关闭套接字后尝试写入套接字,则会收到“Broken pipe”。阅读过程在哪里?
-
如果
}是孩子 2 的结尾,find输出的接收者(莫名其妙地被那里的 STDOUT_FILENO 欺骗)将在那里隐式关闭,这将破坏孩子 1 的套接字。跨度>