2017-12-08 4 views
-3

제목에 두 아들이 모음 (son2)과 자음 (son2)을 연구하는 C 프로그램을 작성하려고합니다. 연구를 수행하기 위해 나는 2 개의 함수를 사용하는데, 첫 번째는 모음을 연구하고 두 번째는 자음을 연구합니다. 내가 커맨드 라인에서 프로그램 3 개의 파일에 부여 :C fork()와의 모음 및 자음 연구

31 °가

29 ° 자음, 모음의 조합에 저장되는 파일은 파일이있는 모든 저장 될 것이다 모음은

-3 °

파일이있는 저장됩니다 설립 된 모든 자음이 프로그램은 오류/경고없이 컴파일하지만, 제대로 연구를 완료하지 않습니다

, 여기에 예입니다

설립 :

- 첫 파일 : 쿼티

- 두번째 파일 : 어이

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

} 

도움!

EDIT (최종) 코드 (지금 노력하고 있습니다) 당신은 어떤 특정 값에 pid1 또는 pid2를 초기화하지 않는 데이비드 C. 순위

+0

'tolower (ch)'를 사용하면'if '조건의 수를 2 배로 줄일 수 있습니다. 왜 1 대신 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으로 계산되며 pid1pid1 이후 0

이제 0이되는 설정되며, if(pid1 > 0) 거짓 조건을 가지고, 코드 블록 그 후 것 부모의 자식 또는에서 실행되지 않습니다. 두 번째 fork()은 결코 호출되지 않으며 부모 프로세스에서는 호출되지 않습니다.


조사 할 또 다른 사항은 상위 프로세스의 모든 파일을 여는 효과입니다. Are file descriptors shared when fork()ing?, 에 대한 대답의 정보를 참조하면 한 어린이가 입력 파일에서 문자를 읽을 때 다른 어린이가 그 문자를 건너 뛸 수 있습니다. 각 자식에 의해 수신 된 입력은 자식 프로세스가 read에 대한 호출이 무작위로 겹쳐 질 수있는 순서에 따라 달라집니다.

부모 대신 자식 프로세스에서 파일을 열어 볼 수 있습니다 (입력 파일을 두 번 열어야 함). 그러면 파일이 지워지는지 확인할 수 있습니다.

+0

이 감독을 수정하기 위해 코드를 다시 편집했으나 문제가 여전히 코드가 무작위로 행동하여 첫 번째 파일의 문자와 동일한 숫자와 문자 유형을 인식하지 못하는 것 같습니다.하지만이 사실은 내가 할 수있는 사실의 결과 일 것입니다. 제대로 작동하지 않습니다. – Allen

+0

임의의 동작을 설명 할 수있는 답변을 추가했습니다. –

+0

오픈 sys 호출과 관련된 모든 것 같았습니다. 한 번 부모 호출에서 코드 호출이 제대로 작동하기 시작한 호출에 대한 위치가 바뀌 었습니다. 감사합니다! – Allen

1

의 끝의 모든 다음의 단순화. pid1이 0이면 pid2을 전혀 값으로 설정하지 마십시오. 하지만 처음으로 ifpid2의 값을 확인합니다. 그건 옳지 않아. <=보다 더 높은 우선 순위를 가지고 있습니다, C에서

if(pid1 = fork() < 0) 

, 그래서 작업의 순서는 다음과 같이이다 :

+0

지금 포크와 모든 자음 생성에 대한 제어와 관련된 몇 가지 수정 사항이있는 코드는 인식되지만 모든 모음은 건너 뜁니다. pid1 또는 pid2를 특정 값으로 초기화하면 무엇을 의미합니까? – Allen

+0

'pid1'이 0보다 크다고 가정합니다. 'if (pid2 == 0)'에 도달하면,'pid2'의 값은 어떻게 될 것이라고 생각하십니까? 어떤 코드가 값을 설정합니까? –

+0

pid1이 0보다 큰 경우 포크가 pid2의 값을 0으로 설정해야한다고 가정합니다. 맞습니까? – Allen