2016-10-12 2 views
0

Я делаю простой проект на C с fork() и socketpairs. Программа запускает процесс, а затем создает сокет-пар для процессов, чтобы разговаривать друг с другом. Родительский процесс читает строки из stdin один за раз до EOF, а затем отправляет строки один за другим. Ребенок преобразует строки в верхний регистр и отправляет их обратно родителям, которые отправляют их в стандартный вывод. Вот мой код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; 
} 

Моя программа печатает первую строку из stdin заглавной, но затем она зависает. Мне нужно ctrl-c выйти. Как я могу получить сокеты для циклического перехода до тех пор, пока EOF не напечатает измененные строки?

+0

уверен, символ новой строки получает слева на конце стандартного ввода и он продолжает получать чтения снова и снова, как терминатор для линия. Вы должны сделать что-то вроде команды ignore. Это довольно распространенный вопрос. Найдите «stdin newline ignore» без кавычек. – xaxxon

ответ

1

Моя программа печатает первую строку из stdin заглавными буквами, но затем она стоит . Мне нужно ctrl-c выйти. Как я могу получить сокеты в цикле через , пока EOF не напечатает измененные строки?

Процедура вашего дочернего процесса (то есть, которая выполняет вызовы 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

Спасибо. Надзор с моей стороны –

Смежные вопросы