この前の質問の回答: https://stackoverflow.com/a/2035683/960086 チェックされておらず、静かだったので、見逃しました。すでにここに投稿するように求められています
子プロセスでソケット接続を作成するアプリケーションをいじっています。
今私の問題はそれをテストしようとすることですが、アプリケーションを実行するたびに、赤い四角または右下のメイン(実行)Xボタンをクリックして閉じると、Netbeansはメイン(ビルド、実行)とメイン(実行)を作成します。プロセスは「終了」しますが、そこにとどまり、IDE を終了すると、「IDE を終了すると終了します...」main(run)」と表示されます。
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);
}
}
}