我正在编写一个程序,在其中我使用系统调用fork()来创建子进程,然后创建一个孙子,以及在子孙之间创建一个管道。我认为我的实现相当不错,但是当我运行程序时,它只是跳过代码中的提示。
基本上我们有这个:
- 过程开始
Fork()创建子
孩子创造管道
Fork()创建孙子,管道继承。
TL; DR-代码跳过UI提示,不确定我是否正确输入数据,不确定我是否正确地将数据读入进程。
如何读取管道输入?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
void main(int argc, char *argv[])
{
int p[2];
int pid, pid2;
pid = fork();
if(pid == 0)
{
pipe(p);
pid2 = fork();
switch(pid2)
{
case -1:
printf("CASE 1");
exit(-1);
case 0:
close(0);
dup(p[0]);
close(p[0]);
close(p[1]);
execl("./Sort/sort", 0);
break;
default:
close(1);
dup(p[1]);
close(p[1]);
close(p[0]);
execl("./Pre/pre", 0);
break;
}
}
else
{
wait(pid);
printf("Process Completed\n");
exit(0);
}
}
pre的子进程:
#include <stdio.h>
void main (int argc, char *argv[])
{
char n1[20];
int g1;
FILE *ofp, *ifp;
int track;
ofp = fopen("output.txt", "w");
while(track != -1)
{
printf("Please enter the student's grade and then name, ");
printf("separated by a space: ");
scanf("%3d %s", &g1, n1);
if (g1 >= 60)
{
fprintf(ofp, "%s\n", n1);
}
printf("Add another name?(-1 to quit, 0 to continue): ");
scanf("%d", &track);
}
fclose(ofp);
ifp = fopen("output.txt", "r");
printf("Students that made a 60+:\n");
while(fscanf(ifp, "%s", n1) == 1)
printf("%s\n", n1);
fclose(ifp);
排序的子进程:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int stringcmp(const void *a, const void *b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
return strcmp(*ia, *ib);
}
void main(int argc, char *argv[])
{
int i = 0;
int num = 0;
int j = 0;
char name[20];
printf("How many names would you like to enter? ");
scanf("%d", &num);
char **input = malloc(num * sizeof(char*));
for (i=0; i < num; i++)
{
printf("Please input a name(first only): ");
scanf("%s", name);
input[i] = strdup(name);
}
qsort(input, num, sizeof(char *), stringcmp);
printf("Names:\n");
for(j = 0; j < num; j++)
printf("%s\n", input[j]);
for( i = 0; i < num; i++ ) free(input[i]);
free(input);
答案 0 :(得分:1)
观察pre
输出提示输入到stdout 。该文本将最终出现在管道中,最终会出现在sort
的{{1}}中。
您应该stdin
提示fprintf
。
stderr
也不会以pre
所需的格式输出文字; sort
需要一个整数sort
,后跟n
个单词(名字)。因此,这应该是n
在pre
上输出的仅文本;其他所有内容都需要转到文件或stdout
。
P.S。此外,使用stderr
代替dup2(p[0], 0)
,因为它可以使您的意图更清晰,并且可能避免线程问题(当然,只有在有线程时才相关,但值得记住)。
答案 1 :(得分:0)
以下是两个如何操作的例子
编辑:我可以说你试图将“./Pre/pre”的输出传递给“./Sort/sort”的输入但是我不确定你的意思是“代码跳过UI提示“因为case 1:
和default:
您没有任何提示。究竟是什么问题?如果您想要更具体的内容,请在您的问题中解释更多细节。