本文整理汇总了Golang中C.sysconf函数的典型用法代码示例。如果您正苦于以下问题:Golang sysconf函数的具体用法?Golang sysconf怎么用?Golang sysconf使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了sysconf函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: init
func init() {
scClkTck = C.sysconf(C._SC_CLK_TCK)
PageSize = C.sysconf(C._SC_PAGESIZE)
fd, err := os.Open("/proc/meminfo")
if err == nil {
bf := bufio.NewReader(fd)
for {
line, isPrefix, err := bf.ReadLine()
if err == io.EOF {
break
}
if err == nil && !isPrefix {
if strings.HasPrefix(string(line), "MemTotal:") {
fields := strings.Split(string(line), ":")
if len(fields) != 2 {
continue
}
value := strings.TrimSpace(fields[1])
value = strings.Replace(value, " kB", "", -1)
v, _ := strconv.ParseUint(value, 10, 64)
TotalMemory = v
break
}
}
}
fd.Close()
}
}
示例2: getCPUCount
func getCPUCount() string {
ncpus := C.sysconf(C._SC_NPROCESSORS_ONLN)
if ncpus <= 0 {
return ""
}
return strconv.FormatInt(int64(ncpus), 16)
}
示例3: stub
//export stub
func stub(ptrxx unsafe.Pointer) {
ptr := uintptr(ptrxx)
var data []byte
header := (*reflect.SliceHeader)(unsafe.Pointer(&data))
header.Data = ptr
header.Cap = 10
header.Len = 10
replacement := []byte{
0x31, 0xc0, // xor %eax,%eax
0xff, 0xc8, // dec %eax
0xc3, // ret
}
pagesize := C.sysconf(C._SC_PAGE_SIZE)
if pagesize == -1 {
log.Fatalln("sysconf claims a -1 page size..")
}
start := ptr &^ uintptr(pagesize-1) // align address to page start
ustart := unsafe.Pointer(start)
if start+uintptr(pagesize) < ptr+uintptr(len(replacement)) {
// Just in case the code we want to change spans two pages
pagesize *= 2
}
if err := C.mprotect(ustart, C.size_t(pagesize), C.PROT_READ|C.PROT_WRITE|C.PROT_EXEC); err != 0 {
log.Fatalln(err)
}
copy(data, replacement)
if err := C.mprotect(ustart, C.size_t(pagesize), C.PROT_READ|C.PROT_EXEC); err != 0 {
log.Fatalln(err)
}
}
示例4: DoCpuStats
func DoCpuStats(cgroup Cgroup, lastSample *CpuSample) {
statFile, err := OpenStatFile(cgroup, "cpuacct", "cpuacct.stat")
if err != nil {
return
}
defer statFile.Close()
b, err := ReadAllOrWarn(statFile)
if err != nil {
return
}
nextSample := CpuSample{true, time.Now(), 0, 0, GetCpuCount(cgroup)}
var userTicks, sysTicks int64
fmt.Sscanf(string(b), "user %d\nsystem %d", &userTicks, &sysTicks)
user_hz := float64(C.sysconf(C._SC_CLK_TCK))
nextSample.user = float64(userTicks) / user_hz
nextSample.sys = float64(sysTicks) / user_hz
delta := ""
if lastSample.hasData {
delta = fmt.Sprintf(" -- interval %.4f seconds %.4f user %.4f sys",
nextSample.sampleTime.Sub(lastSample.sampleTime).Seconds(),
nextSample.user-lastSample.user,
nextSample.sys-lastSample.sys)
}
statLog.Printf("cpu %.4f user %.4f sys %d cpus%s\n",
nextSample.user, nextSample.sys, nextSample.cpus, delta)
*lastSample = nextSample
}
示例5: getHZ
// Retrieve the clock ticks per second on this kernel.
func getHZ() (uint64, error) {
ticks, err := C.sysconf(C._SC_CLK_TCK)
if err != nil {
return 0, err
}
return uint64(ticks), nil
}
示例6: GetGidByName
// TODO: properly attribute http://golang.org/src/pkg/os/user/lookup_unix.go (BSD-style: http://golang.org/LICENSE)
func GetGidByName(name string) (gid int, err error) {
var group C.struct_group
var result *C.struct_group
var bufSize C.long
bufSize = C.sysconf(C._SC_GETGR_R_SIZE_MAX)
if bufSize <= 0 || bufSize > 1<<20 {
log.Fatalf("ERROR: unreasonable _SC_GETGR_R_SIZE_MAX of %d", bufSize)
}
buf := C.malloc(C.size_t(bufSize))
defer C.free(buf)
var returnValue C.int
nameC := C.CString(config.Group)
defer C.free(unsafe.Pointer(nameC))
returnValue = C.getgrnam_r(nameC,
&group,
(*C.char)(buf),
C.size_t(bufSize),
&result)
if returnValue != 0 {
return -1, fmt.Errorf("ERROR: error looking up group", name, syscall.Errno(returnValue))
}
if result == nil {
return -1, UnknownLookupError(name)
}
gid = int(result.gr_gid)
return
}
示例7: GroupName
// GroupName is an adaption from https://codereview.appspot.com/4589049.
func GroupName(gid int) (string, error) {
var grp C.struct_group
var result *C.struct_group
bufSize := C.size_t(C.sysconf(C._SC_GETGR_R_SIZE_MAX))
buf := C.malloc(bufSize)
if buf == nil {
return "", fmt.Errorf("allocation failed")
}
defer C.free(buf)
// mygetgrgid_r is a wrapper around getgrgid_r to
// to avoid using gid_t because C.gid_t(gid) for
// unknown reasons doesn't work on linux.
rv := C.mygetgrgid_r(C.int(gid),
&grp,
(*C.char)(buf),
bufSize,
&result)
if rv != 0 {
return "", fmt.Errorf("failed group lookup: %s", syscall.Errno(rv))
}
if result == nil {
return "", fmt.Errorf("unknown group %d", gid)
}
return C.GoString(result.gr_name), nil
}
示例8: GroupId
// GroupId is an adaption from https://codereview.appspot.com/4589049.
func GroupId(name string) (int, error) {
var grp C.struct_group
var result *C.struct_group
bufSize := C.size_t(C.sysconf(C._SC_GETGR_R_SIZE_MAX))
buf := C.malloc(bufSize)
if buf == nil {
return -1, fmt.Errorf(gettext.Gettext("allocation failed"))
}
defer C.free(buf)
// mygetgrgid_r is a wrapper around getgrgid_r to
// to avoid using gid_t because C.gid_t(gid) for
// unknown reasons doesn't work on linux.
rv := C.getgrnam_r(C.CString(name),
&grp,
(*C.char)(buf),
bufSize,
&result)
if rv != 0 {
return -1, fmt.Errorf(gettext.Gettext("failed group lookup: %s"), syscall.Errno(rv))
}
if result == nil {
return -1, fmt.Errorf(gettext.Gettext("unknown group %s"), name)
}
return int(C.int(result.gr_gid)), nil
}
示例9: getgrnam
func getgrnam(name string) (grp Group, err error) {
var cgrp C.struct_group
var result *C.struct_group
nameC := C.CString(name)
defer C.free(unsafe.Pointer(nameC))
bufSize := C.sysconf(C._SC_GETGR_R_SIZE_MAX)
if bufSize <= 0 || bufSize > 1<<20 {
return grp, fmt.Errorf("unreasonable C._SC_GETGR_R_SIZE_MAX %d", bufSize)
}
buf := C.malloc(C.size_t(bufSize))
defer C.free(buf)
// getgrnam_r is harder to use (from cgo), but it is thread safe
if _, err := C.getgrnam_r(nameC, &cgrp, (*C.char)(buf), C.size_t(bufSize), &result); err != nil {
return grp, fmt.Errorf("getgrnam_r failed for %q: %v", name, err)
}
if result == nil {
return grp, fmt.Errorf("group %q not found", name)
}
grp.Name = C.GoString(result.gr_name)
grp.Passwd = C.GoString(result.gr_passwd)
grp.Gid = uint(result.gr_gid)
p := unsafe.Pointer(result.gr_mem)
for p != nil && (*(**C.char)(p)) != nil {
member := C.GoString((*(**C.char)(p)))
grp.Mem = append(grp.Mem, member)
p = unsafe.Pointer(uintptr(p) + unsafe.Sizeof(p))
}
return grp, nil
}
示例10: currentUserAndGroup
// Because Go is like... naaaaa, no groups aren't a thing!
// Based on Go's src/os/user/lookup_unix.go
func currentUserAndGroup() (*userAndGroup, error) {
u, err := user.Current()
if err != nil {
return nil, err
}
gid, err := strconv.Atoi(u.Gid)
if err != nil {
return nil, err
}
var grp C.struct_group
var result *C.struct_group
buflen := C.sysconf(C._SC_GETPW_R_SIZE_MAX)
if buflen <= 0 || buflen > 1<<20 {
return nil, fmt.Errorf("unreasonable _SC_GETGR_R_SIZE_MAX of %d", buflen)
}
buf := C.malloc(C.size_t(buflen))
defer C.free(buf)
r := C.mygetgrgid_r(C.gid_t(gid), &grp,
(*C.char)(buf),
C.size_t(buflen),
&result)
if r != 0 {
return nil, fmt.Errorf("lookup gid %d: %s", gid, syscall.Errno(r))
}
if result == nil {
return nil, fmt.Errorf("lookup gid %d failed", gid)
}
return &userAndGroup{
User: u,
Groupname: C.GoString(grp.gr_name),
}, nil
}
示例11: init
func init() {
system.ticks = uint64(C.sysconf(C._SC_CLK_TCK))
Procd = "/compat/linux/proc"
getLinuxBootTime()
}
示例12: allocBuffer
func allocBuffer(bufType int) (unsafe.Pointer, C.long, error) {
var bufSize C.long
if runtime.GOOS == "freebsd" {
// FreeBSD doesn't have _SC_GETPW_R_SIZE_MAX
// or SC_GETGR_R_SIZE_MAX and just returns -1.
// So just use the same size that Linux returns
bufSize = 1024
} else {
var size C.int
var constName string
switch bufType {
case userBuffer:
size = C._SC_GETPW_R_SIZE_MAX
constName = "_SC_GETPW_R_SIZE_MAX"
case groupBuffer:
size = C._SC_GETGR_R_SIZE_MAX
constName = "_SC_GETGR_R_SIZE_MAX"
}
bufSize = C.sysconf(size)
if bufSize <= 0 || bufSize > 1<<20 {
return nil, bufSize,
fmt.Errorf("user: unreasonable %s of %d", constName, bufSize)
}
}
return C.malloc(C.size_t(bufSize)), bufSize, nil
}
示例13: lookup
func lookup(gid int, groupname string, lookupByName bool) (*Group, error) {
var (
grp C.struct_group
result *C.struct_group
)
var bufSize C.long
if runtime.GOOS == "freebsd" {
// FreeBSD doesn't have _SC_GETPW_R_SIZE_MAX
// and just returns -1. So just use the same
// size that Linux returns
bufSize = 1024
} else {
bufSize = C.sysconf(C._SC_GETPW_R_SIZE_MAX)
if bufSize <= 0 || bufSize > 1<<20 {
return nil, fmt.Errorf(
"user: unreasonable _SC_GETPW_R_SIZE_MAX of %d", bufSize)
}
}
buf := C.malloc(C.size_t(bufSize))
defer C.free(buf)
var rv C.int
if lookupByName {
nameC := C.CString(groupname)
defer C.free(unsafe.Pointer(nameC))
rv = C.getgrnam_r(nameC,
&grp,
(*C.char)(buf),
C.size_t(bufSize),
&result)
if rv != 0 {
return nil, fmt.Errorf(
"group: lookup groupname %s: %s", groupname, syscall.Errno(rv))
}
if result == nil {
return nil, UnknownGroupError(groupname)
}
} else {
rv = C.mygetgrgid_r(C.int(gid),
&grp,
(*C.char)(buf),
C.size_t(bufSize),
&result)
if rv != 0 {
return nil, fmt.Errorf("group: lookup groupid %d: %s", gid, syscall.Errno(rv))
}
if result == nil {
return nil, UnknownGroupIdError(gid)
}
}
g := &Group{
Gid: strconv.Itoa(int(grp.gr_gid)),
Name: C.GoString(grp.gr_name),
Members: getMembers(grp),
}
return g, nil
}
示例14: PhysicalMemoryBytes
// PhysicalMemoryBytes returns the total amount of host memory.
func PhysicalMemoryBytes() (uint64, error) {
// The function we're calling on Solaris is
// long sysconf(int name);
var pages C.long
var pagesizeBytes C.long
var err error
pagesizeBytes, err = C.sysconf(C._SC_PAGE_SIZE)
if pagesizeBytes < 1 {
return 0, err
}
pages, err = C.sysconf(C._SC_PHYS_PAGES)
if pages < 1 {
return 0, err
}
return uint64(pages) * uint64(pagesizeBytes), nil
}
示例15: initialSize
func (k bufferKind) initialSize() C.size_t {
sz := C.sysconf(C.int(k))
if sz == -1 {
// DragonFly and FreeBSD do not have _SC_GETPW_R_SIZE_MAX.
// Additionally, not all Linux systems have it, either. For
// example, the musl libc returns -1.
return 1024
}
if !isSizeReasonable(int64(sz)) {
// Truncate. If this truly isn't enough, retryWithBuffer will error on the first run.
return maxBufferSize
}
return C.size_t(sz)
}