C 无法关闭/终止Netbeans中的子进程
回答上一个问题: 它没有被检查和安静下来,所以我错过了它。已经要求在这里发布 我正在玩一个在子进程上创建套接字连接的应用程序 现在我的问题是试图测试它,但每次我运行应用程序时,Netbeans都会在我通过单击红色方框或右下角的MainRunX按钮关闭时创建mainBuild、run和mainRun。进程终止,但它仍停留在那里,然后在退出IDE时,它表示退出IDE将终止。。。主线 这是我第一次使用fork和c,所以我想我在终止主进程时没有终止子进程,但是我也应该能够手动终止吗?或者,有没有一种方法可以让套接字连接在不阻塞其余代码的情况下持续侦听 注意:连接不正确,因为它仍然有阻塞C 无法关闭/终止Netbeans中的子进程,c,netbeans,fork,child-process,C,Netbeans,Fork,Child Process,回答上一个问题: 它没有被检查和安静下来,所以我错过了它。已经要求在这里发布 我正在玩一个在子进程上创建套接字连接的应用程序 现在我的问题是试图测试它,但每次我运行应用程序时,Netbeans都会在我通过单击红色方框或右下角的MainRunX按钮关闭时创建mainBuild、run和mainRun。进程终止,但它仍停留在那里,然后在退出IDE时,它表示退出IDE将终止。。。主线 这是我第一次使用fork和c,所以我想我在终止主进程时没有终止子进程,但是我也应该能够手动终止吗?或者,有没有一种方法
connection()
...
connection() {
int pid = fork();
if (pid < 0)
{
perror("ERROR on fork");
exit(1);
}
if (pid == 0)
{
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
fd_set fds;
struct timeval timeout;
int rc;
/* Set time limit. */
timeout.tv_sec = 0;
timeout.tv_usec = 10;
char buffer[256];
portno = 4444;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname("Localhost");
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
while(1) {
/* Create a descriptor set containing our two sockets. */
FD_ZERO(&fds);
FD_SET(sockfd, &fds);
rc = select(sizeof(fds)*8, &fds, NULL, NULL, &timeout);
if (rc==-1) {
perror("select failed");
}
if (rc > 0) {
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
}
rc = select(sizeof(fds)*8, &fds, NULL, NULL, &timeout);
if (rc==-1) {
perror("select failed");
}
if (rc > 0) {
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("Client: Server send %s",buffer);
useEvent(buffer);
}
}
}
如果没有更多关于孩子行为的代码/细节,就很难知道。无论如何,如果子进程创建了一个连接,而父进程正在关闭,您需要通知子进程并将其正确关闭。我添加了子进程的完整代码,目的是建立一个连接,该连接可以读取、侦听端口,并且在调用时可以发送消息。好的,但请格式化代码。提高可读性的一个好办法是将子代码移动到函数中。正如我之前所说的:如果孩子正在监听一个套接字,而家长死亡,你需要通知孩子这一点并关闭它,否则它将继续运行。你可以截获家长中相对接近onExit的kill信号,并通过你选择的IPC机制通知孩子。这甚至可能在两个方向上都是可能的,因为每个人都知道其他方向