FishKylin 的学生作业:
#include
#include
#include
#include
#include
#include
char * s_gets(char *str, int n);
int main(void)
{
pid_t pid;
int pipeline[2];
if (pipe(pipeline) == -1)
{
perror("[ERROR] pipe:");
exit(EXIT_FAILURE);
}
pid = fork();
if (pid == -1)
{
perror("[ERROR] fork:");
exit(EXIT_FAILURE);
} else if (pid == 0)
{
ssize_t rbytes;
char buffer[64];
// 关闭写
close(pipeline[1]);
while ((rbytes = read(pipeline[0], buffer, sizeof(buffer) - 1)) > 0)
{
buffer[rbytes] = '\0';
if (rbytes == -1)
{
perror("[ERROR] read:");
close(pipeline[0]);
exit(EXIT_FAILURE);
}
if (strcmp(buffer, "quit") == 0 || rbytes == 0)
break;
printf("Child Process: %s\n", buffer);
}
// 关闭读
close(pipeline[0]);
exit(EXIT_SUCCESS);
} else {
ssize_t wbytes;
// 关闭读
close(pipeline[0]);
char buffer[64];
while (1)
{
s_gets(buffer, 64);
wbytes = write(pipeline[1], buffer, strlen(buffer));
if (wbytes == -1)
{
perror("[ERROR] write:");
wait(NULL);
close(pipeline[1]);
exit(EXIT_FAILURE);
}
if (strcmp(buffer, "quit") == 0)
{
printf("exit program...\n");
wait(NULL);
close(pipeline[1]);
exit(EXIT_FAILURE);
}
}
}
return 0;
}
// 获取输入去掉换行符
char * s_gets(char *str, int n)
{
char *ret_val = fgets(str, n, stdin);
if (ret_val)
{
char *find = strchr(str, '\n');
if (find)
*find = '\0';
else
while (getchar() != '\n')
continue;
}
return ret_val;
}