程序片段:
int sock_fd; FILE *sock_fpo, *sock_fpi, *pipe_fp; sock_fd = accept(sock_id, NULL, NULL); if (sock_fd == -1 ) oops("accept"); if ((sock_fpi = fdopen(sock_fd, "r")) == NULL) oops("fdopen reading"); if (fgets(dirname, BUFSIZ - 5, sock_fpi) == NULL) oops("reading dirname"); if ((sock_fpo = fdopen(sock_fd, "w")) == NULL) oops("fdopen writing"); if ((pipe_fp = popen(command, "r")) == NULL) oops("popen"); while ((c = getc(pipe_fp)) != EOF) putc(c, sock_fpo); pclose(pipe_fp); pclose(sock_fpo); pclose(sock_fpi);
此程序片段为服务器socket片段,在调试过程中发现。当我将:
pclose(sock_fpo); pclose(sock_fpi);
的顺序改为:
pclose(sock_fpi); pclose(sock_fpo);
无法正确的将数据写到socket,并传递给客户端。
总结:
由于:pipe_fp, sock_fpo, sock_fpi的打开顺序为sock_fpi,sock_fpo,pipe_fp。
一定要以相反的顺序关闭描述符,先打开的后关闭。即:pipe_fp, sock_fpo, sock_fpi。
时间: 2024-10-24 12:23:54