Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我的程序不停地运行,使我的终端崩溃_C - Fatal编程技术网

C 我的程序不停地运行,使我的终端崩溃

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

我的终端一直在创建和分叉。我认为我的代码中有错误,我实际上希望在客户端连接时使用fork,但是当我启动服务器时,当我使用linux命令“ps”检查时,它会一直使用fork,我如何更改代码以使其正常工作

#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)