2016-10-12 5 views
0

fork()socketpairs과 같은 간단한 프로젝트를 C에서 수행하고 있습니다. 프로그램이 프로세스를 포크 (fork)하면 프로세스가 서로 통신 할 소켓 쌍이 생성됩니다. 부모 프로세스는 한 번에 하나씩 stdin에서 EOF까지 줄을 읽은 다음 줄을 하나씩 자식에게 보냅니다. 자식은 줄을 대문자로 변환하여 부모에게 보낸다. 부모는 stdout으로 보낸다. 여기 내 코드는Socketpair는 stdin의 첫 번째 줄만 인쇄합니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <sys/types.h> 
#include <sys/socket.h> 

int main(int argc, char *argv[]) { 
    /* code */ 
    int returnCode, status, socket[2], j; 
    char* buffer; 
    size_t bufferSize = 100; 
    size_t line; 

    buffer = (char *)malloc(bufferSize * sizeof(char)); 
    socketpair(AF_UNIX, SOCK_STREAM, 0, socket); 

    returnCode = fork(); 
    if(returnCode == -1){ 
    printf("Fork failed\n"); 
    } 
    if(returnCode > 0){ 
    while(getline(&buffer, &bufferSize, stdin) != -1){ 
     write(socket[1], buffer, bufferSize); 
     read(socket[1], buffer, bufferSize); 
     printf("%s", buffer); 
    } 
    } 
    else{ 
    read (socket[0], buffer, bufferSize); 
    for(j = 0; j[buffer];j++){ 
     buffer[j] = toupper(buffer[j]); 
    } 
    write(socket[0], buffer, bufferSize); 
    } 
    return 0; 
} 

내 프로그램은 대문자로 시작하는 첫 줄을 인쇄하지만 멈 춥니 다. 나는 Ctrl-c를 눌러 종료해야합니다. 수정 된 줄을 인쇄 할 때까지 어떻게 소켓을 반복합니까?

+0

개행 문자가 stdin의 끝에 남았는지 확인하고 반복적으로 읽는 것을 반복합니다. 선. 당신은 일종의 무시 명령을해야합니다. 꽤 일반적인 질문입니다. 따옴표없이 "stdin newline ignore"를 검색하십시오. – xaxxon

답변

1

내 프로그램은 stdin의 첫 줄을 대문자로 인쇄하지만 그 다음에 이 멈 춥니 다. 나는 Ctrl-c를 눌러 종료해야합니다. 수정 된 줄을 인쇄 할 때까지 소켓을 루프를 통해 까지 얻으려면 어떻게해야합니까?

toupper() 호출을 수행하는 루틴은 read() 호출을 한 번만 수행 한 다음 write()를 한 번 호출하고 종료합니다. 그래서 한 줄만 처리됩니다. 여러 줄을 처리하려면 코드를 루프에 넣어야합니다.

[...] 
    else{ 
    while(read(socket[0], buffer, bufferSize) > 0) 
    { 
     for(j = 0; j[buffer];j++){ 
     buffer[j] = toupper(buffer[j]); 
     } 
     write(socket[0], buffer, bufferSize); 
    } 
    } 
    return 0; 
} 
+0

감사합니다. 내 부분에 대한 감독 –