2017-12-08 8 views
-3

タイトルで言うように、私は2人の息子が母音(son2)と子音(son2)を研究するプログラムをC言語で作成しようとしています。研究を行うために、私は母音を最初に研究する2つの関数を使用し、子音を研究するために2番目の関数を使用します。私は、コマンドラインからプログラム3以上のファイルに与える :C fork()の母音と子音の研究

-1°母音と子音

-2°の組み合わせを格納したファイルは、すべて保存されたファイルであるに母音は

を設立-3°すべての子音は、プログラムがエラー/警告なしでコンパイルされているが、それは正しく、研究を完了していない、ここでは一例である

を設立保存されたファイルである。

-firstファイル:qwerty配列

- セカンドファイル:EY

- 第3ファイル:QR私はのために事前にそれを

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

感謝をコンパイルするには、これらのコマンドを使用し

#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); 
      } 
     } 
    } 

} 

助けて!あなたが任意の特定の値にpid1またはpid2を初期化しないデビッド・C.ランキン

+0

'tolower(ch)'を使うと、if条件の数を2倍に減らすことができます。ちょうど 'if(isalpha(ch)){ch = tolower(ch); if(ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')return 1;それ以外の場合は2を返します。 } '(またはあなたが子音や母音を示したいもの) –

+0

私の本は決してこの機能を引用していないと言わなければならない、チップのおかげで! – Allen

答えて

0

は、ここでは、トラブルの可能性の高いソースだ

  1. コールfork()
  2. fork() < 0を評価してください。 fork()が負の場合は1、それ以外の場合は0と評価されます。
  3. fork() < 0の値に設定します。

通常、両方の親プロセスおよび子供に、fork()が返され、0又は正の数(親は子プロセスを作成することができたことを条件とします)。だから、親と子プロセスの両方で、 fork() < 0は0と評価され、pid1が現在0に等しいのでpid1が0

に設定され、if(pid1 > 0)が偽の条件を持っていますし、コードのブロック、それの後親の子またはでは実行されません。 2番目のfork()は呼び出されることはありません。親プロセスでも呼び出されることはありません。


もう1つのことは、親プロセス内のすべてのファイルを開くことによる影響です。 Are file descriptors shared when fork()ing?、 の回答の情報を参照すると、ある子供が入力ファイルから文字を読み込むと、他の子供がその文字をスキップすることがあります。 各子が受け取った入力は、子プロセスがreadへの呼び出しが重複している順序に依存します。

親プロセスではなく子プロセスでファイルを開くことができます(入力ファイルを2回開く必要があります)。そのファイルがクリアされるかどうか確認してください。

+0

この見落としを修正するためのコードを再編集しましたが、コードはランダムに動作するように見えますが、最初のファイルの文字数と種類は同じではありませんが、これは私ができることそれが正しく動作するようにしてください – Allen

+0

私はランダムな動作を説明するかもしれない答えに何かを加えました。 –

+0

オープンsys呼び出しに関連するすべてのものだったようですが、一旦その呼び出しの位置を親から息子にシフトさせると、コードが正しく動作するようになりました。どうもありがとうございます! – Allen

1

のヒント次のすべてに簡略化

EDIT(最終) コード(今働いています)。 pid1がゼロの場合は、pid2に値を設定しないでください。しかし、最初のifpid2の値をチェックします。それは正しいことではありません。 <=よりも優先順位が高い、Cで

if(pid1 = fork() < 0) 

、その動作の順序は次のようなものです::

+0

今更新すると、フォークの作成とすべての子音の制御に関するいくつかの修正が加えられたコードは認識されますが、すべての母音はスキップされます。 pid1またはpid2を特定の値に初期化するとどういう意味ですか? – Allen

+0

'pid1'が0より大きいとします。 'if(pid2 == 0)'になったとき、 'pid2'の値はどうなると思いますか?その値を設定するコードは何ですか? –

+0

pid1が0より大きい場合、私はforkがpid2の値を0に設定する必要があると思います。 – Allen

関連する問題