qfedu-linux-advanced-level/day4/homework/h4.c

80 lines
2.9 KiB
C
Raw Normal View History

2023-08-18 01:09:47 +08:00
/*
fork()
*/
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main()
{
pid_t pid1, pid2;
int fd1[2], fd2[2];
int f1 = pipe(fd1);
int f2 = pipe(fd2);
if (f1 == -1 || f2 == -1)
{
perror("pipe"); // 创建管道失败
_exit(1); // 创建管道失败,退出
}
pid1 = fork();
if (pid1 == 0)
{
close(fd1[1]); // 子进程1关闭管道写端
char buf[32] = "";
int len = read(fd1[0], buf, sizeof(buf));
printf("子进程 1 收到父进程数据: %s\n", buf);
for (int i = 0; i < strlen(buf); i++)
{
if (buf[i] >= 'a' && buf[i] <= 'z')
buf[i] -= 32;
}
write(fd2[1], buf, strlen(buf) + 1); // 包括'\0' , 写入管道
close(fd2[1]); // 关闭管道写端
_exit(0); // 子进程1退出
}
pid2 = fork();
if (pid2 == 0)
{
close(fd2[1]); // 子进程2关闭管道写端
char buf[32] = "";
int len = read(fd2[0], buf, sizeof(buf));
printf("子进程 2 收到子进程 1 数据: %s\n", buf);
close(fd2[0]); // 关闭管道读端
_exit(0); // 子进程2退出
}
close(fd1[0]); // 父进程关闭管道读端
char msg[32] = "";
printf("请在父进程中输入一段内容: ");
scanf("%s", msg);
write(fd1[1], msg, strlen(msg) + 1); // 包括'\0' , 写入管道
close(fd1[1]); // 关闭管道写端
/*
: 0退NULL表示不关心子进程退出状态0
: 退pid退-1
: 退退
: 退退
1 退; 2 退
-1 退
WNOHANG
WUNTRACED
WCONTINUED
WIFEXITED(status) 退0
WEXITSTATUS(status) WIFEXITED(status)0退
WIFSIGNALED(status) 退0
*/
waitpid(0, NULL, 0); // 等待所有子进程退出
return 0;
}