我想把管子复制成一个壳。例如ls |排序
一开始我在尝试管道,但我无法让家长读取孩子执行的结果:
//pipes essai
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/wait.h>
# include <assert.h>
# include <string.h>
# include <sys/stat.h>
# include <fcntl.h>
enum {
MaxLigne = 1024, // longueur max d'une ligne de commandes
MaxMot = MaxLigne / 2, // nbre max de mot dans la ligne
MaxDirs = 100, // nbre max de repertoire dans PATH
MaxPathLength = 512,
// longueur max d'un nom de fichier
};
void decouper(char *, char *, char **, int);
int spawn(char * pathname, char * mot[]);
# define PROMPT "? "
int main(int argc, char * argv[]) {
char ligne[MaxLigne];
char pathname[MaxPathLength];
char * mot[MaxMot];
char * dirs[MaxDirs];
int i, tmp, x;
int fd[2];
int t, res = 0;
char buf[1024];
char * mot2[10];
/* Decouper PATH en repertoires */
decouper(getenv("PATH"), ":", dirs, MaxDirs);
/* read the command lines and try to execute them */
for (printf(PROMPT); fgets(ligne, sizeof ligne, stdin) != 0; printf(PROMPT)) {
decouper(ligne, " \t\n", mot, MaxMot);
if (mot[0] == 0) // empty line
continue;
//launch the pipe
int p=pipe(fd);
assert(p>=0);
tmp = fork(); // launch the pipe process
if (tmp < 0) {
perror("fork");
continue;
}
if (tmp != 0) { // parent wait for end of child
//close this side of the pipe
close(fd[1]);
//waiting
while (wait(0) != tmp)
;
//when finish waiting read what the child has written in the pipe
read(fd[0], buf, sizeof(buf));
//print the result
printf("read %s\n", buf);
//get back the hand to the user
continue;
}else if (tmp==0){
// child
//close this side of the pipe
close(fd[0]);
//close stdout
t=close(1);
//make sur stdout is closed
assert(t>=0);
//open the pipe for writing in it instead of in the stdout
FILE * sortie=fdopen(fd[1], O_WRONLY);
//make sure it is ok
assert(sortie!=NULL);
//try to execute the command
for (i = 0; dirs[i] != 0; i++) {
snprintf(pathname, sizeof pathname, "%s/%s", dirs[i], mot[0]);
execv(pathname, mot);
}
}
// if exec was unsuccessful
fprintf(stderr, "%s: not found\n", mot[0]);
exit(1);
}
printf("Bye\n");
return 0;
}
void decouper(char * ligne, char * separ, char * mot[], int maxmot){
int i;
mot[0] = strtok(ligne, separ);
for(i = 1; mot[i - 1] != 0; i++){
if (i == maxmot){
fprintf(stderr, "Erreur dans la fonction decouper: trop de mots\n");
mot[i - 1] = 0;
}
mot[i] = strtok(NULL, separ);
}
}
此行文件*sortie=fdopen(fd[1],O_WRONLY)有问题;
pipe1.c:在函数“main”中:
pipe1.c:81:4:警告:传递“fdopen”的参数2将使指针从整数变成不带强制转换的
/usr/include/stdio.h:303:14:注意:应为“const char*”,但参数的类型为“int”
但是我怎样才能让孩子在管道里输出呢??? 氟利昂也不起作用
我得到的结果是:
? LS
阅读
这当然意味着什么都不读。我能做什么我现在真的没有主意了???
非常感谢你提前
最佳答案
您混淆了fdopen
和open
的签名。fdopen
将aconst char*
作为其第二个参数。尝试
FILE * sortie=fdopen(fd[1], "w");
参考:
http://linux.die.net/man/3/fdopen
编辑:您使用
fdopen
似乎没有正当理由。特别是,在初始化之后,我看不到sortie
的任何用途。我想你是在为执行程序建立标准。如果是这样,您应该使用
dup
或dup2
:close(fd[0]);
close(1);
dup(fd[1]);
close(fd[1]);
//try to execute the command
... as before
参考:
http://linux.die.net/man/2/dup