我在C中做了一个涉及fork()
和socketpairs
的简单项目。程序分叉一个进程,然后为进程创建一个套接字对,以便彼此进行通信。父进程一次一个地读取stdin中的行直到EOF,然后逐个发送子行。子将行转换为大写并将它们发送回父级,父级将它们发送到stdout。这是我的代码
#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 :(得分: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;
}