我有两个进程,父进程和子进程,需要执行两个与管道同步的命令。在程序的输入中提供了一个包含在两个不同行上的这些命令的文本文件。所以会是这样的:
ps aux
wc -l <br/>
我发现了关于或多或少相同问题的其他问题,但是我还没有弄清楚这里可能出什么问题。
void write_to_pipe(int pipeIn[], char *commands_file){
FILE *command_stream ;
char *line = NULL ; //contains the first command
char *command, *options[200] ;
int i = 0 ;
close(STDOUT_FILENO);
if(dup(pipeIn[1])== -1){
perror("Duplication failed");
exit(1);
}
close(pipeIn[0]);
close(pipeIn[1]);
command_stream = fopen(commands_file,"r");
if (getline(&line, 0, command_stream)!= -1){
fclose(command_stream);
command = strtok(line," ");//tokenize string with a separator
options[i++] = command ;
while((options[i] = strtok(line," "))!= NULL){
i++ ;
}
execvp(command, options);
perror("execvp failed");
exit(1);
}
}
此函数使用dup将stdout重定向到管道。然后,它在输入中打开文件,并使用该行的第一个标记作为命令,其余作为参数调用execvp。 读取功能非常相似
void read_from_pipe(int pipeIn[], char *commands_file){
FILE *command_stream ;
char *line = NULL ; //contains the second command
char *command, *options[200] ;
int i = 0 ;
close(STDIN_FILENO);
if(dup(pipeIn[0])== -1){
perror("Duplication failed");
exit(1);
}
close(pipeIn[1]);
close(pipeIn[0]);
command_stream = fopen(commands_file,"r");
getline(&line, 0, command_stream);
if (getline(&line, 0, command_stream)!= -1){
fclose(command_stream);
command = strtok(line," ");//tokenize string with a separator
options[i++] = command;
while((options[i] = strtok(line," "))!= NULL){
i++ ;
}
execvp(command, options);
perror("execvp failed");
exit(1);
}
}
唯一的区别是,再次调用getline以跳过第一行,因为读者必须执行第二条命令。 然后是主要的:
int main(int argc, char *argv[]){
//if no file is given the program does nothing
if (argv[1]){
pid_t pid ;
int mypipe[2] ;
if (pipe(mypipe)){
//pipe creation has failed
perror("Pipe creation failed");
exit(1);
}
pid = fork();
switch(pid){
case 0:
read_from_pipe(mypipe,argv[1]);
break;
case -1:
perror("Fork failed");
break;
default:
write_to_pipe(mypipe,argv[1]);
break;
}
}
return 0 ;
}
该程序可以编译并运行,但是什么也不输出。
[编辑]调整execvp使其命令包含在参数数组中,并检查dup是否存在错误。仍然没有输出。