12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- // Copyright 2018 gf Author(https://github.com/gogf/gf). All Rights Reserved.
- //
- // This Source Code Form is subject to the terms of the MIT License.
- // If a copy of the MIT was not distributed with this file,
- // You can obtain one at https://github.com/gogf/gf.
- package gproc
- import (
- "errors"
- "fmt"
- "github.com/gogf/gf/container/gmap"
- "github.com/gogf/gf/net/gtcp"
- "github.com/gogf/gf/os/gfile"
- "github.com/gogf/gf/util/gconv"
- )
- // MsgRequest is the request structure for process communication.
- type MsgRequest struct {
- SendPid int // Sender PID.
- RecvPid int // Receiver PID.
- Group string // Message group name.
- Data []byte // Request data.
- }
- // MsgResponse is the response structure for process communication.
- type MsgResponse struct {
- Code int // 1: OK; Other: Error.
- Message string // Response message.
- Data []byte // Response data.
- }
- const (
- gPROC_COMM_DEFAULT_GRUOP_NAME = "" // Default group name.
- gPROC_DEFAULT_TCP_PORT = 10000 // Starting port number for receiver listening.
- gPROC_MSG_QUEUE_MAX_LENGTH = 10000 // Max size for each message queue of the group.
- )
- var (
- // commReceiveQueues is the group name to queue map for storing received data.
- // The value of the map is type of *gqueue.Queue.
- commReceiveQueues = gmap.NewStrAnyMap(true)
- // commPidFolderPath specifies the folder path storing pid to port mapping files.
- commPidFolderPath = gfile.TempDir("gproc")
- )
- func init() {
- // Automatically create the storage folder.
- if !gfile.Exists(commPidFolderPath) {
- err := gfile.Mkdir(commPidFolderPath)
- if err != nil {
- panic(fmt.Errorf(`create gproc folder failed: %v`, err))
- }
- }
- }
- // getConnByPid creates and returns a TCP connection for specified pid.
- func getConnByPid(pid int) (*gtcp.PoolConn, error) {
- port := getPortByPid(pid)
- if port > 0 {
- if conn, err := gtcp.NewPoolConn(fmt.Sprintf("127.0.0.1:%d", port)); err == nil {
- return conn, nil
- } else {
- return nil, err
- }
- }
- return nil, errors.New(fmt.Sprintf("could not find port for pid: %d", pid))
- }
- // getPortByPid returns the listening port for specified pid.
- // It returns 0 if no port found for the specified pid.
- func getPortByPid(pid int) int {
- path := getCommFilePath(pid)
- content := gfile.GetContentsWithCache(path)
- return gconv.Int(content)
- }
- // getCommFilePath returns the pid to port mapping file path for given pid.
- func getCommFilePath(pid int) string {
- return gfile.Join(commPidFolderPath, gconv.String(pid))
- }
|