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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問板塊 發(fā)新帖
查看: 2180 | 回復(fù): 10
打印 上一主題 下一主題

菜鳥請(qǐng)教一個(gè)關(guān)于管道的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-06-15 00:21 |只看該作者 |倒序?yàn)g覽
這個(gè)程序的用法是在主進(jìn)程中輸入命令  ,然后在子進(jìn)程中執(zhí)行命令  ,然后通過管道將輸出結(jié)果再傳回主進(jìn)程并顯示, 但是多執(zhí)行幾次命令就出現(xiàn)問題了
(這個(gè)程序還有很多問題,暫且只考慮執(zhí)行命令這個(gè)問題)
代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
int main()
{
    pid_t  pid;
    int  fd1[2], fd2[2];
    char  cmdstring[128],show_buf[8192];
    int  n, flags;
    pipe(fd1);
    pipe(fd2);
    pid = fork();
    switch(pid)
    {
         case -1:
               perror("fork");
               exit(1);
         case 0:
               close(0);
               close(1);
               close(fd1[1]);
               close(fd2[0]);
               dup(fd1[0]);
               dup(fd2[1]);
               execl("/bin/sh","sh", NULL);
        default:
              close(fd1[0]);
              close(fd2[1]);
              flags = fcntl(fd2[0], F_GETFL, 0);
              flags |= O_NONBLOCK;
              fcntl(fd2[0], F_SETFL, flags);
              while(1)
             {
                   fgets(cmdstring, 128, stdin);
                   n = strlen(cmdstring);
                   write(fd1[1], cmdstring, n);
                   read(fd2[0], show_buf, 8192);
                   printf("%s",show_buf);
                   memset(show_buf, 0, 8192);
            }
    }
}

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-06-15 09:11 |只看該作者
為什么執(zhí)行結(jié)果傳給主進(jìn)程再輸出啊,麻煩

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2009-06-15 09:37 |只看該作者

回復(fù) #2 eveson 的帖子

我是要寫一個(gè)模擬telnet的程序  ,只有在父進(jìn)程里面才能對(duì)輸出內(nèi)容進(jìn)行處理,  子進(jìn)程因?yàn)橛昧?execl("/bin/sh","sh", NULL); 所以無法對(duì)子進(jìn)程的輸出作處理 ,所以就要把它用管道傳到父進(jìn)程里面,然后通過socket發(fā)送

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-06-15 09:58 |只看該作者
標(biāo)準(zhǔn)出錯(cuò)沒有搞,

write(fd1[1], cmdstring, n);
read(fd2[0], show_buf, 8192);

輸入命令后不一定能夠馬上讀取輸出吧

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2009-06-15 12:38 |只看該作者

回復(fù) #4 bobozhang 的帖子

雖然不能馬上讀出來 ,但是read應(yīng)該會(huì)阻塞吧??

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-06-15 12:56 |只看該作者
原帖由 lanxi226 于 2009-6-15 12:38 發(fā)表
雖然不能馬上讀出來 ,但是read應(yīng)該會(huì)阻塞吧??


flags |= O_NONBLOCK;
fcntl(fd2[0], F_SETFL, flags);

你已經(jīng)把它設(shè)置為nonblock了阿

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2009-06-15 12:59 |只看該作者
原帖由 lanxi226 于 2009-6-15 12:38 發(fā)表
雖然不能馬上讀出來 ,但是read應(yīng)該會(huì)阻塞吧??


flags |= O_NONBLOCK;
fcntl(fd2[0], F_SETFL, flags);

你已經(jīng)把它設(shè)置為nonblock了阿

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2009-06-15 13:07 |只看該作者
哦, 弄錯(cuò)了 ,那是為了像輸入pwd這些命令的時(shí)候,沒有返回信息,就讓read非阻塞,不然就一直卡在那兒了。 那請(qǐng)問有什么解決方法呢??

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2009-06-15 13:09 |只看該作者

回復(fù) #7 bobozhang 的帖子

哦, 弄錯(cuò)了 ,那是為了像輸入pwd這些命令的時(shí)候,沒有返回信息,就讓read非阻塞,不然就一直卡在那兒了。 那請(qǐng)問有什么解決方法呢??

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2009-06-15 13:23 |只看該作者
看看返回值是不是為0
您需要登錄后才可以回帖 登錄 | 注冊(cè)

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP