亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4085 | 回復: 12
打印 上一主題 下一主題

[Linux] 詢問父進程傳遞一個sockfd給子進程的問題 :Bad file descriptor [復制鏈接]

論壇徽章:
4
亥豬
日期:2013-09-27 13:50:29酉雞
日期:2013-10-09 13:08:59丑牛
日期:2013-10-20 11:16:47亥豬
日期:2013-10-26 11:50:59
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-11-07 20:29 |只看該作者 |倒序瀏覽
rt, 父進程 創(chuàng)建子進程池, 然后父進程accept一個newconnfd,然后使用pipe傳給子進程, 子進程無法對這個newconnfd 進行recv也無法send, 總是報Bad file descriptor...
我把這個newconnfd的值在父進程accept的時候打印了出來, 在子進程從pipe里面讀出來的時候也打印了一下,發(fā)現(xiàn)他們的值是一樣的...
(ps:查看了下unpv2的一個例子,他是用msg來傳遞的...難道是不能這樣用pipe傳遞使用么? 求高人指點下啊 )

論壇徽章:
4
亥豬
日期:2013-09-27 13:50:29酉雞
日期:2013-10-09 13:08:59丑牛
日期:2013-10-20 11:16:47亥豬
日期:2013-10-26 11:50:59
2 [報告]
發(fā)表于 2013-11-07 20:31 |只看該作者
再加一句, 所有的recv和send 代碼移動到父進程中就正確了回復 1# AssassinPig


   

論壇徽章:
4
亥豬
日期:2013-09-27 13:50:29酉雞
日期:2013-10-09 13:08:59丑牛
日期:2013-10-20 11:16:47亥豬
日期:2013-10-26 11:50:59
3 [報告]
發(fā)表于 2013-11-07 20:31 |只看該作者
再加一句, 所有的recv和send 代碼移動到父進程中就正確了回復 1# AssassinPig


   

論壇徽章:
16
CU十二周年紀念徽章
日期:2013-10-24 15:41:3415-16賽季CBA聯(lián)賽之廣東
日期:2015-12-23 21:21:55青銅圣斗士
日期:2015-12-05 10:35:30黃金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日論壇發(fā)貼之星
日期:2015-11-18 06:20:00程序設計版塊每日發(fā)帖之星
日期:2015-11-18 06:20:002015亞冠之城南
日期:2015-11-10 19:10:492015亞冠之薩濟拖拉機
日期:2015-10-28 18:47:282015亞冠之柏太陽神
日期:2015-08-30 17:21:492015亞冠之山東魯能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
4 [報告]
發(fā)表于 2013-11-07 20:39 |只看該作者
回復 3# AssassinPig


    因為你的子進程并沒有繼承父進程的fd。原因就是你先創(chuàng)建子進程池的時候,,那哈還沒有accept,,所以就不能繼承了

論壇徽章:
4
亥豬
日期:2013-09-27 13:50:29酉雞
日期:2013-10-09 13:08:59丑牛
日期:2013-10-20 11:16:47亥豬
日期:2013-10-26 11:50:59
5 [報告]
發(fā)表于 2013-11-07 20:59 |只看該作者
我也想過是這個原因,但是我參考的代碼就是在這么干的...所以我很迷惑啊...回復 4# tc1989tc


   

論壇徽章:
16
CU十二周年紀念徽章
日期:2013-10-24 15:41:3415-16賽季CBA聯(lián)賽之廣東
日期:2015-12-23 21:21:55青銅圣斗士
日期:2015-12-05 10:35:30黃金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日論壇發(fā)貼之星
日期:2015-11-18 06:20:00程序設計版塊每日發(fā)帖之星
日期:2015-11-18 06:20:002015亞冠之城南
日期:2015-11-10 19:10:492015亞冠之薩濟拖拉機
日期:2015-10-28 18:47:282015亞冠之柏太陽神
日期:2015-08-30 17:21:492015亞冠之山東魯能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
6 [報告]
發(fā)表于 2013-11-07 21:54 |只看該作者
把你參考的代碼貼出來

論壇徽章:
4
亥豬
日期:2013-09-27 13:50:29酉雞
日期:2013-10-09 13:08:59丑牛
日期:2013-10-20 11:16:47亥豬
日期:2013-10-26 11:50:59
7 [報告]
發(fā)表于 2013-11-07 23:05 |只看該作者
  1. /* include serv05a */
  2. #include        "unp.h"
  3. #include        "child.h"

  4. static int                nchildren;

  5. int
  6. main(int argc, char **argv)
  7. {
  8.         int                        listenfd, i, navail, maxfd, nsel, connfd, rc;
  9.         void                sig_int(int);
  10.         pid_t                child_make(int, int, int);
  11.         ssize_t                n;
  12.         fd_set                rset, masterset;
  13.         socklen_t        addrlen, clilen;
  14.         struct sockaddr        *cliaddr;

  15.         if (argc == 3)
  16.                 listenfd = Tcp_listen(NULL, argv[1], &addrlen);
  17.         else if (argc == 4)
  18.                 listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
  19.         else
  20.                 err_quit("usage: serv05 [ <host> ] <port#> <#children>");

  21.         FD_ZERO(&masterset);
  22.         FD_SET(listenfd, &masterset);
  23.         maxfd = listenfd;
  24.         cliaddr = Malloc(addrlen);

  25.         nchildren = atoi(argv[argc-1]);
  26.         navail = nchildren;
  27.         cptr = Calloc(nchildren, sizeof(Child));

  28.                 /* 4prefork all the children */
  29.         for (i = 0; i < nchildren; i++) {
  30.                 child_make(i, listenfd, addrlen);        /* parent returns */
  31.                 FD_SET(cptr[i].child_pipefd, &masterset);
  32.                 maxfd = max(maxfd, cptr[i].child_pipefd);
  33.         }

  34.         Signal(SIGINT, sig_int);

  35.         for ( ; ; ) {
  36.                 rset = masterset;
  37.                 if (navail <= 0)
  38.                         FD_CLR(listenfd, &rset);        /* turn off if no available children */
  39.                 nsel = Select(maxfd + 1, &rset, NULL, NULL, NULL);

  40.                         /* 4check for new connections */
  41.                 if (FD_ISSET(listenfd, &rset)) {
  42.                         clilen = addrlen;
  43.                         connfd = Accept(listenfd, cliaddr, &clilen);

  44.                         for (i = 0; i < nchildren; i++)
  45.                                 if (cptr[i].child_status == 0)
  46.                                         break;                                /* available */

  47.                         if (i == nchildren)
  48.                                 err_quit("no available children");
  49.                         cptr[i].child_status = 1;        /* mark child as busy */
  50.                         cptr[i].child_count++;
  51.                         navail--;

  52.                         n = Write_fd(cptr[i].child_pipefd, "", 1, connfd);
  53.                         Close(connfd);
  54.                         if (--nsel == 0)
  55.                                 continue;        /* all done with select() results */
  56.                 }

  57.                         /* 4find any newly-available children */
  58.                 for (i = 0; i < nchildren; i++) {
  59.                         if (FD_ISSET(cptr[i].child_pipefd, &rset)) {
  60.                                 if ( (n = Read(cptr[i].child_pipefd, &rc, 1)) == 0)
  61.                                         err_quit("child %d terminated unexpectedly", i);
  62.                                 cptr[i].child_status = 0;
  63.                                 navail++;
  64.                                 if (--nsel == 0)
  65.                                         break;        /* all done with select() results */
  66.                         }
  67.                 }
  68.         }
  69. }
  70. /* end serv05a */

  71. void
  72. sig_int(int signo)
  73. {
  74.         int                i;
  75.         void        pr_cpu_time(void);

  76.                 /* 4terminate all children */
  77.         for (i = 0; i < nchildren; i++)
  78.                 kill(cptr[i].child_pid, SIGTERM);
  79.         while (wait(NULL) > 0)                /* wait for all children */
  80.                 ;
  81.         if (errno != ECHILD)
  82.                 err_sys("wait error");

  83.         pr_cpu_time();

  84.         for (i = 0; i < nchildren; i++)
  85.                 printf("child %d, %ld connections\n", i, cptr[i].child_count);

  86.         exit(0);
  87. }
復制代碼

論壇徽章:
4
亥豬
日期:2013-09-27 13:50:29酉雞
日期:2013-10-09 13:08:59丑牛
日期:2013-10-20 11:16:47亥豬
日期:2013-10-26 11:50:59
8 [報告]
發(fā)表于 2013-11-07 23:06 |只看該作者
  1. /* include child_make */
  2. #include        "unp.h"
  3. #include        "child.h"

  4. pid_t
  5. child_make(int i, int listenfd, int addrlen)
  6. {
  7.         int                sockfd[2];
  8.         pid_t        pid;
  9.         void        child_main(int, int, int);

  10.         Socketpair(AF_LOCAL, SOCK_STREAM, 0, sockfd);

  11.         if ( (pid = Fork()) > 0) {
  12.                 Close(sockfd[1]);
  13.                 cptr[i].child_pid = pid;
  14.                 cptr[i].child_pipefd = sockfd[0];
  15.                 cptr[i].child_status = 0;
  16.                 return(pid);                /* parent */
  17.         }

  18.         Dup2(sockfd[1], STDERR_FILENO);                /* child's stream pipe to parent */
  19.         Close(sockfd[0]);
  20.         Close(sockfd[1]);
  21.         Close(listenfd);                                        /* child does not need this open */
  22.         child_main(i, listenfd, addrlen);        /* never returns */
  23. }
  24. /* end child_make */

  25. /* include child_main */
  26. void
  27. child_main(int i, int listenfd, int addrlen)
  28. {
  29.         char                        c;
  30.         int                                connfd;
  31.         ssize_t                        n;
  32.         void                        web_child(int);

  33.         printf("child %ld starting\n", (long) getpid());
  34.         for ( ; ; ) {
  35.                 if ( (n = Read_fd(STDERR_FILENO, &c, 1, &connfd)) == 0)
  36.                         err_quit("read_fd returned 0");
  37.                 if (connfd < 0)
  38.                         err_quit("no descriptor from read_fd");

  39.                 web_child(connfd);                                /* process request */
  40.                 Close(connfd);

  41.                 Write(STDERR_FILENO, "", 1);        /* tell parent we're ready again */
  42.         }
  43. }
  44. /* end child_main */
復制代碼

論壇徽章:
4
亥豬
日期:2013-09-27 13:50:29酉雞
日期:2013-10-09 13:08:59丑牛
日期:2013-10-20 11:16:47亥豬
日期:2013-10-26 11:50:59
9 [報告]
發(fā)表于 2013-11-07 23:06 |只看該作者
  1. #include        "unp.h"

  2. #define        MAXN        16384                /* max # bytes client can request */

  3. void
  4. web_child(int sockfd)
  5. {
  6.         int                        ntowrite;
  7.         ssize_t                nread;
  8.         char                line[MAXLINE], result[MAXN];

  9.         for ( ; ; ) {
  10.                 if ( (nread = Readline(sockfd, line, MAXLINE)) == 0)
  11.                         return;                /* connection closed by other end */

  12.                         /* 4line from client specifies #bytes to write back */
  13.                 ntowrite = atol(line);
  14.                 if ((ntowrite <= 0) || (ntowrite > MAXN))
  15.                         err_quit("client request for %d bytes", ntowrite);

  16.                 Writen(sockfd, result, ntowrite);
  17.         }
  18. }
復制代碼

論壇徽章:
4
亥豬
日期:2013-09-27 13:50:29酉雞
日期:2013-10-09 13:08:59丑牛
日期:2013-10-20 11:16:47亥豬
日期:2013-10-26 11:50:59
10 [報告]
發(fā)表于 2013-11-07 23:07 |只看該作者
unp代碼里面 server/serv05.c child05.c web_child.c
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP