C研究元音和辅音与fork()

时间:2017-12-08 23:25:12

标签: c fork

正如标题所说,我试图在C中创建一个程序,其中2个子进程研究元音(son2)和辅音(son2)。为了进行研究,我使用了2个函数,第一个用于研究元音,第二个用于研究辅音。 我从命令行向程序提供了另外3个文件:

-1°是存储元音和辅音

的组合的文件

-2°是将存储所有元音的文件

-3°是将存储所有辅音创建的文件

程序编译时没有错误/警告,但它没有正确完成研究,这是一个例子:

-first file:qwerty

- 第二个文件:ey

- 第三档:qr

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <ctype.h>

int test_vowel(char ch) 
{
if(ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' || 
ch == 'y')
    return(1);
else 
    return(0);
}


int main(int argc, char *argv[])
{
char c, d;
int s;
pid_t pid1 = 10, pid2 = 10;

if((pid1 = fork()) < 0)
{
  printf("Error in the creation of the first fork\n");
  _exit(0);
}
if(pid1 > 0)
{
 if((pid2 = fork()) < 0)
    {
      printf("Error in the creation of the second fork\n");
      _exit(0);
    }
}

int input = open(argv[1],O_RDONLY);
int output1 = open(argv[2],O_RDWR | O_CREAT | O_TRUNC, 0666);
int output2 = open(argv[3],O_RDWR | O_CREAT | O_TRUNC, 0666);

if(pid2 == 0)
    {
     while((s = read(input, &c, 1)) != 0)
        {
         if(test_vowel(tolower(c)) == 1)
            {
             printf("I've read a vowel = %d\n", d);
             write(output1, &c, 1);
            }
        }
    }

if(pid1 == 0)
    {
     while((s = read(input, &d, 1)) != 0)
        {
         if(test_vowel(tolower(d)) == 0)
            {
             printf("I've read a consonant = %d\n", d);
             write(output2, &d,1);
            }
        }
    }

}

我使用这些命令编译它

gcc c.c
./a.out c.txt v.txt b.txt

提前感谢您的帮助!

EDIT(最终)   在David C. Rankin的所有提示之后简化了代码(现在正在工作)

2 个答案:

答案 0 :(得分:1)

您不会将pid1pid2初始化为任何特定值。如果pid1为零,则不会将pid2设置为任何值。但是,您的第一个if会检查pid2的值。这不可能是正确的。

答案 1 :(得分:0)

这是一个可能的麻烦来源:

if(pid1 = fork() < 0)

在C中,<的优先级高于=,因此操作的顺序如下:

  1. 致电fork()
  2. 评估fork() < 0。如果fork()为负数,则计算结果为1,否则为0。
  3. pid1设置为fork() < 0
  4. 的值

    通常,在父进程和子进程中,fork()将返回0或正数(假设父进程能够创建子进程)。所以在父进程和子进程中, fork() < 0将评估为0,pid1将设置为0。

    由于pid1现在等于0,if(pid1 > 0)将具有错误条件,并且其后的代码块将不会在父项中的子项中执行。永远不会调用第二个fork(),即使在要调用它的父进程中也是如此。

    要研究的另一件事是打开父进程中的所有文件的效果。 参考答案中的信息 Are file descriptors shared when fork()ing?, 当一个孩子从输入文件中读取一个字符时,它可能会导致另一个孩子跳过&#34;跳过&#34;那个角色。 然后,每个孩子接收的输入将取决于孩子处理的顺序。对read的调用重叠,这可能是随机的。

    您可以尝试打开子进程中的文件而不是父进程(因此输入文件必须打开两次)并查看是否清除了这些文件。