func New(pid string, joinUserNS bool) (*Process, error) {
	p := Process{Pid: pid}
	if err := p.parseStat(); err != nil {
		return nil, err
	}
	if err := p.parseStatus(joinUserNS); err != nil {
		return nil, err
	}
	if err := p.parseCmdLine(); err != nil {
		return nil, err
	}
	if err := p.parsePIDNamespace(); err != nil {
		if !os.IsPermission(err) {
			return nil, err
		}
	}
	if err := p.parseLabel(); err != nil {
		return nil, err
	}
	return &p, nil
}
New returns a new Process with the specified pid and parses the relevant
data from /proc and /dev.
package process
import (
	"errors"
	"fmt"
	"os"
	"strconv"
	"time"
	"github.com/containers/psgo/internal/host"
	"github.com/containers/psgo/internal/proc"
	"github.com/opencontainers/runc/libcontainer/user"
)
type Process struct {
	Pid string
	Stat proc.Stat
	Status proc.Status
	CmdLine []string
	Label string
	PidNS string
	Huser string
	Hgroup string
}
func LookupGID(gid string) (string, error) {
	gidNum, err := strconv.Atoi(gid)
	if err != nil {
		return "", fmt.Errorf("error parsing group ID: %w", err)
	}
	g, err := user.LookupGid(gidNum)
	if err != nil {
		return gid, nil
	}
	return g.Name, nil
}
func LookupUID(uid string) (string, error) {
	uidNum, err := strconv.Atoi(uid)
	if err != nil {
		return "", fmt.Errorf("error parsing user ID: %w", err)
	}
	u, err := user.LookupUid(uidNum)
	if err != nil {
		return uid, nil
	}
	return u.Name, nil
}