亚洲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