Я делаю простой проект на 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 не напечатает измененные строки?
уверен, символ новой строки получает слева на конце стандартного ввода и он продолжает получать чтения снова и снова, как терминатор для линия. Вы должны сделать что-то вроде команды ignore. Это довольно распространенный вопрос. Найдите «stdin newline ignore» без кавычек. – xaxxon