c - 将 fgets() 与管道一起使用

标签 c pipe fork fgets gets

我需要编写在 Linux 操作系统上运行的程序:

  • 当主程序启动时,子程序从主程序中分离出来,当子程序受到父程序的中断时可以执行;

  • 父程序等待键盘输入的文本行(文本行应按 结束);

  • 输入文本行后,父程序向子程序发送中断,子程序通过“管道” channel 读取文本行并创建一个文本文件。

  • 如果输入空行,则程序的两个部分都会结束它们的工作。

问题是,我知道使用 gets() 是不好的,那么在我的情况下如何改用 fgets()?

 #include <stdio.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <sys/types.h>
 #include <unistd.h>

 FILE *f;

 int main(void)
 {
 int pfds[2];
 char buf[1000];

 pipe(pfds);
 f = fopen("input.txt", "w");
 fclose(f);


do 
{

    if (!fork()) 
    {
     printf("PARENT: enter input text from keyboard\n");
     gets(buf);
         printf("PARENT: writing to the pipe\n");
         write(pfds[1], buf, 1000);
     printf("PARENT: exiting\n");
         exit(0);
     } 
     else 
    {
     f = fopen("input.txt", "a+");
         printf("CHILD: waiting from PARENT\n");
         read(pfds[0], buf, 1000);
     printf("CHILD: read \"%s\"\n", buf);        
     fprintf(f,"%s\n", buf);
     fclose(f);
     printf("CHILD: input.txt file created\n", buf);
         wait(NULL);
     }
 } 
     while (buf[0] != '\0');

     printf("PROGRAM: done\n");

     return 0;
 }

最佳答案

您已在"w" 模式下打开文件。

f = fopen("program.txt", "w");

w 模式创建一个用于写入的空文件。如果已存在同名文件,则删除其内容并将该文件视为新的空文件。

"w+""a+" 模式打开文件。

关于c - 将 fgets() 与管道一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40796210/

相关文章:

c - Unix - 从子阻塞排序

c - Fork 和多处理

fork - 为什么我的防病毒程序没有检测到这种恶意行为?

c++ - XSD 限制可以特定于平台吗?

c - 包含字母、空格和整数的 sscanf

linux - 如何在 linux 中创建一个可以从多个进程读取而不消耗数据的文件描述符?

Angular2 异步嵌套数据

C++等待问题

c - 如何简化 C 语言中的二进制搜索代码?

c - 如何将字符串转换为int并将结果放入数组