C 我的程序不停地运行,使我的终端崩溃
我的终端一直在创建和分叉。我认为我的代码中有错误,我实际上希望在客户端连接时使用fork,但是当我启动服务器时,当我使用linux命令“ps”检查时,它会一直使用fork,我如何更改代码以使其正常工作C 我的程序不停地运行,使我的终端崩溃,c,C,我的终端一直在创建和分叉。我认为我的代码中有错误,我实际上希望在客户端连接时使用fork,但是当我启动服务器时,当我使用linux命令“ps”检查时,它会一直使用fork,我如何更改代码以使其正常工作 #include <iostream> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/un.h> #include <sys/typ
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
using namespace std;
int main()
{
int serverFd;
int clientFd;
int serverLen;
int clientLen;
string message;
string serverSockAddrPtr;
struct sockaddr* serverSockAddressPnt;
struct sockaddr* clientSockAddressPnt;
struct sockaddr_un serverAddress;
struct sockaddr_un clientAddress;
// SOCKET CREATION PART - SERVER
serverFd = socket (AF_LOCAL, SOCK_STREAM, 0);
/* Set domain type */
serverAddress.sun_family = AF_LOCAL;
/* Set name */
strcpy (serverAddress.sun_path, "CountryServer");
/* GET SIZE OF Server Addres */
serverLen = sizeof serverAddress;
/* GET SIZE OF Client Addres */
clientLen = sizeof clientAddress;
/* Get Server Sock Address Pointer*/
serverSockAddressPnt = (struct sockaddr *) &serverAddress;
/* Get Client Sock Address Pointer*/
clientSockAddressPnt = (struct sockaddr *) &clientAddress;
/* Create file */
bind (serverFd, serverSockAddressPnt , serverLen);
/* listen for connection */
listen (serverFd,5);
// SOCKET CREATION END - SERVER
while(1)
{
//accept client connection
clientFd = accept(serverFd, clientSockAddressPnt, (socklen_t*)&clientLen);
if(fork()==0)
{
message="Successfully connected to the server";
write(clientFd,message.c_str(),strlen(message.c_str())+1);
close(clientFd);
exit(0);
}
else
close(clientFd);
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
int serverFd;
int clientFd;
int serverLen;
国际客户;
字符串消息;
字符串服务器SOCKADDRPTR;
结构sockaddr*serverSockAddressPnt;
结构sockaddr*clientSockAddressPnt;
结构sockaddr_un serverAddress;
结构sockaddr_un clientAddress;
//套接字创建部分-服务器
serverFd=socket(AF\u本地,SOCK\u流,0);
/*设置域类型*/
serverAddress.sun_family=AF_LOCAL;
/*集合名称*/
strcpy(serverAddress.sun_路径,“CountryServer”);
/*获取服务器地址的大小*/
serverLen=服务器地址的大小;
/*获取客户端地址的大小*/
clientLen=clientAddress的大小;
/*获取服务器Sock地址指针*/
serverSockAddressPnt=(结构sockaddr*)&serverAddress;
/*获取客户端Sock地址指针*/
clientSockAddressPnt=(结构sockaddr*)和clientAddress;
/*创建文件*/
绑定(serverFd、serverSockAddressPnt、serverLen);
/*监听连接*/
听(5);
//套接字创建终端服务器
而(1)
{
//接受客户端连接
clientFd=accept(serverFd、clientSockAddressPnt、(socklen\u t*)和clientLen);
如果(fork()==0)
{
message=“已成功连接到服务器”;
写入(clientFd,message.c_str(),strlen(message.c_str())+1);
关闭(clientFd);
出口(0);
}
其他的
关闭(clientFd);
}
返回0;
}
我的问题是:
如何使服务器在连接时分叉一个进程来处理客户端查询
我不希望它无缘无故地继续分叉。
感谢大家的帮助,这是我第一次用C语言编写代码来学习更多编程知识
我的客户端和服务器通过本地主机、sockaddr\u un而不是internet进行通信。循环应该具备以下功能:
while (1) {
clientFd = accept(serverFd, clientSockAddressPnt, (socklen_t*)&clientlen);
if (clientFd >= 0) {
if(fork() == 0) {
message="Successfully connected to the server";
write(clientFd,message.c_str(),strlen(message.c_str())+1);
close(clientFd);
exit(0);
}
else
close(clientFd);
}
}
这样,只有在accept返回非负值时才进行fork操作(这意味着它已成功完成)。您应该检查
accept()
中的返回值。您将得到一个错误,应该对此进行修复
它一直调用fork()的原因是,每次循环时,accept()都会返回(非常快!)出现错误而不是等待新的连接。听起来像是你自己搞砸了?是的,我搞砸了,我该如何修复它哈哈,我是C新手programing@Mysticial:不是会使机器崩溃的叉式炸弹,而是(一次一个)连续的叉式炸弹因为未检查
accept
的返回值是否有错误。如何使程序在客户端连接时分叉,而不是保持分叉。我正在进行本地主机连接,仅sockaddr\u un,而不是使用if语句互连if/else块,以确保仅在连接时才执行它。如果我调用正确,请接受成功时返回一个非负整数,因此您可能希望if(clientFd>=0)
谢谢。您的回答解决了我的问题。我应该如何继续检查。并确保它不会保留fork,并且在连接客户端时只使用fork来处理客户端。没有客户端连接时不执行任何操作(不使用fork)