管道行为不稳定,对实现没有信心
Pipe behavior is erratic, not confident about implementation
我正在 Linux 学习 ipc 并试用管道。我在父进程和两个子进程之间设置了两个管道。当数据通过管道时,我得到了奇怪的换行符。例如,输出有时会有一个额外的换行符或完全没有换行符,甚至出现在命令行本身上。另外,我不确定我设置管道的方式是否正确。我可能忽略了一些重要的细节并留下了悬空的文件描述符。
void run_processes(Command_Args *cmd_args, char *file_paths)
{
pipe(pipe_RtoA1);
pipe(pipe_RtoA2);
pipe(pipe_A1toT1);
pipe(pipe_A2toT2);
pipe(pipe_T1toR);
pipe(pipe_T2toR);
if (!(pid_A1 = fork())) {
long read = 0;
size_t size = 0;
char *input_str = NULL;
close(pipe_RtoA1[1]);
dup2(pipe_RtoA1[0], 0);
read = getline(&input_str, &size, stdin);
printf("A1 : %s\n", input_str);
} else if (!(pid_A2 = fork())) {
long read = 0;
size_t size = 0;
char *input_str = NULL;
close(pipe_RtoA2[1]);
dup2(pipe_RtoA2[0], 0);
read = getline(&input_str, &size, stdin);
printf("A2 : %s\n", input_str);
} else {
FILE *fRtoA1 = NULL;
FILE *fRtoA2 = NULL;
fRtoA1 = fdopen(pipe_RtoA1[1], "w");
fRtoA2 = fdopen(pipe_RtoA2[1], "w");
close(pipe_RtoA1[0]);
close(pipe_RtoA2[0]);
fprintf(fRtoA1, "%s", file_paths);
fprintf(fRtoA2, "%s", file_paths);
}
}
我计划将管道连接到其他进程,但现在我只想让管道从这个程序 R
到另外两个程序 A1
和 A2
正常工作。
程序 R
将发送 file_paths
管道,A1
和 A2
将打印它们。
您正在启动两个不同的进程,它们以不可预测的顺序输出到标准输出。它们的输出可能是交错的。只是为了确保,为每个子进程打开输出一个文件,并检查内容。
我正在 Linux 学习 ipc 并试用管道。我在父进程和两个子进程之间设置了两个管道。当数据通过管道时,我得到了奇怪的换行符。例如,输出有时会有一个额外的换行符或完全没有换行符,甚至出现在命令行本身上。另外,我不确定我设置管道的方式是否正确。我可能忽略了一些重要的细节并留下了悬空的文件描述符。
void run_processes(Command_Args *cmd_args, char *file_paths)
{
pipe(pipe_RtoA1);
pipe(pipe_RtoA2);
pipe(pipe_A1toT1);
pipe(pipe_A2toT2);
pipe(pipe_T1toR);
pipe(pipe_T2toR);
if (!(pid_A1 = fork())) {
long read = 0;
size_t size = 0;
char *input_str = NULL;
close(pipe_RtoA1[1]);
dup2(pipe_RtoA1[0], 0);
read = getline(&input_str, &size, stdin);
printf("A1 : %s\n", input_str);
} else if (!(pid_A2 = fork())) {
long read = 0;
size_t size = 0;
char *input_str = NULL;
close(pipe_RtoA2[1]);
dup2(pipe_RtoA2[0], 0);
read = getline(&input_str, &size, stdin);
printf("A2 : %s\n", input_str);
} else {
FILE *fRtoA1 = NULL;
FILE *fRtoA2 = NULL;
fRtoA1 = fdopen(pipe_RtoA1[1], "w");
fRtoA2 = fdopen(pipe_RtoA2[1], "w");
close(pipe_RtoA1[0]);
close(pipe_RtoA2[0]);
fprintf(fRtoA1, "%s", file_paths);
fprintf(fRtoA2, "%s", file_paths);
}
}
我计划将管道连接到其他进程,但现在我只想让管道从这个程序 R
到另外两个程序 A1
和 A2
正常工作。
程序 R
将发送 file_paths
管道,A1
和 A2
将打印它们。
您正在启动两个不同的进程,它们以不可预测的顺序输出到标准输出。它们的输出可能是交错的。只是为了确保,为每个子进程打开输出一个文件,并检查内容。