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

Chinaunix

標(biāo)題: 菜鳥(niǎo)請(qǐng)教一個(gè)關(guān)于管道的問(wèn)題 [打印本頁(yè)]

作者: lanxi226    時(shí)間: 2009-06-15 00:21
標(biāo)題: 菜鳥(niǎo)請(qǐng)教一個(gè)關(guān)于管道的問(wèn)題
這個(gè)程序的用法是在主進(jìn)程中輸入命令  ,然后在子進(jìn)程中執(zhí)行命令  ,然后通過(guò)管道將輸出結(jié)果再傳回主進(jìn)程并顯示, 但是多執(zhí)行幾次命令就出現(xiàn)問(wèn)題了
(這個(gè)程序還有很多問(wèn)題,暫且只考慮執(zhí)行命令這個(gè)問(wèn)題)
代碼如下:
#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);
            }
    }
}
作者: eveson    時(shí)間: 2009-06-15 09:11
為什么執(zhí)行結(jié)果傳給主進(jìn)程再輸出啊,麻煩
作者: lanxi226    時(shí)間: 2009-06-15 09:37
標(biāo)題: 回復(fù) #2 eveson 的帖子
我是要寫(xiě)一個(gè)模擬telnet的程序  ,只有在父進(jìn)程里面才能對(duì)輸出內(nèi)容進(jìn)行處理,  子進(jìn)程因?yàn)橛昧?execl("/bin/sh","sh", NULL); 所以無(wú)法對(duì)子進(jìn)程的輸出作處理 ,所以就要把它用管道傳到父進(jìn)程里面,然后通過(guò)socket發(fā)送
作者: bobozhang    時(shí)間: 2009-06-15 09:58
標(biāo)準(zhǔn)出錯(cuò)沒(méi)有搞,

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

輸入命令后不一定能夠馬上讀取輸出吧
作者: lanxi226    時(shí)間: 2009-06-15 12:38
標(biāo)題: 回復(fù) #4 bobozhang 的帖子
雖然不能馬上讀出來(lái) ,但是read應(yīng)該會(huì)阻塞吧??
作者: bobozhang    時(shí)間: 2009-06-15 12:56
原帖由 lanxi226 于 2009-6-15 12:38 發(fā)表
雖然不能馬上讀出來(lái) ,但是read應(yīng)該會(huì)阻塞吧??


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

你已經(jīng)把它設(shè)置為nonblock了阿
作者: bobozhang    時(shí)間: 2009-06-15 12:59
原帖由 lanxi226 于 2009-6-15 12:38 發(fā)表
雖然不能馬上讀出來(lái) ,但是read應(yīng)該會(huì)阻塞吧??


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

你已經(jīng)把它設(shè)置為nonblock了阿
作者: lanxi226    時(shí)間: 2009-06-15 13:07
哦, 弄錯(cuò)了 ,那是為了像輸入pwd這些命令的時(shí)候,沒(méi)有返回信息,就讓read非阻塞,不然就一直卡在那兒了。 那請(qǐng)問(wèn)有什么解決方法呢??
作者: lanxi226    時(shí)間: 2009-06-15 13:09
標(biāo)題: 回復(fù) #7 bobozhang 的帖子
哦, 弄錯(cuò)了 ,那是為了像輸入pwd這些命令的時(shí)候,沒(méi)有返回信息,就讓read非阻塞,不然就一直卡在那兒了。 那請(qǐng)問(wèn)有什么解決方法呢??
作者: ssafa    時(shí)間: 2009-06-15 13:23
看看返回值是不是為0
作者: bobozhang    時(shí)間: 2009-06-15 14:46
select或則用兩個(gè)線程/進(jìn)程




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2