semget函数报错,errno设置为28

在函数运行时出错,查找日志发现semget函数报错,errno设置为28。遇到系统调用发生错误的情况,可以尝试以下几种思路:

1. 使用strerror函数或者perror函数输出错误说明。

2. 如果第一步还不是很清楚,可以根据errno的值找出对应的错误标示,然后再详细查阅出错系统函数的man手册,找到对应错误标示的含义。

PS:大部分时候还是需要采用方法2,例如这次semget函数报错,errno设置为28,我一开始根本不记得28的错误标示是什么,采用strerror函数返回的错误说明为“No space left on device”,我还误以为系统内存不够。最后通过查看errno.h头文件才发现28的错误标示是ENOSPC,再去查semget函数的man手册,查看ENOSPC的具体含义是信号量超出系统限制:A semaphore set has to be created but the system limit for the  maximum  number of  semaphore  sets  (SEMMNI),  or the system wide maximum number of semaphores。

解决办法:可以临时修改内核参数(当然这只是权宜之计,我们最好是找到为什么信号量会超出系统限制,因为正常情况下可能性不大。)

1)sysctl命令可以查看和设置系统内核参数

sysctl -a | grep sem        #查看系统信号量的设置值

kernel.sem = 250        32000   32      128

对应的4个值从左到右分别为SEMMSL、SEMMNS、SEMOPM和SEMMNI。

2)修改方法有三种:数字只作为参考

方法一:echo 610 86620 100 142 > /proc/sys/kernel/sem

方法二:sysctl -w kernel.sem="610 86620 100 142"

方法三:echo "kernel.sem=610 86620 100 142" >> /etc/sysctl.conf


errno的值对应的错误标示,定义在/usr/include/errno.h头文件中,但是该头文件也是包含其他头文件的。这些标示实际上是定义在下面两个头文件中:

/usr/include/asm-generic/errno-base.h

/usr/include/asm-generic/errno.h


这里列出部分errno的错误定义如下:

#define EPERM            1      /* Operation not permitted */
#define ENOENT           2      /* No such file or directory */
#define ESRCH            3      /* No such process */
#define EINTR            4      /* Interrupted system call */
#define EIO              5      /* I/O error */
#define ENXIO            6      /* No such device or address */
#define E2BIG            7      /* Argument list too long */
#define ENOEXEC          8      /* Exec format error */
#define EBADF            9      /* Bad file number */
#define ECHILD          10      /* No child processes */
#define EAGAIN          11      /* Try again */
#define ENOMEM          12      /* Out of memory */
#define EACCES          13      /* Permission denied */
#define EFAULT          14      /* Bad address */
#define ENOTBLK         15      /* Block device required */
#define EBUSY           16      /* Device or resource busy */
#define EEXIST          17      /* File exists */
#define EXDEV           18      /* Cross-device link */
#define ENODEV          19      /* No such device */
#define ENOTDIR         20      /* Not a directory */
#define EISDIR          21      /* Is a directory */
#define EINVAL          22      /* Invalid argument */
#define ENFILE          23      /* File table overflow */
#define EMFILE          24      /* Too many open files */
#define ENOTTY          25      /* Not a typewriter */
#define ETXTBSY         26      /* Text file busy */
#define EFBIG           27      /* File too large */
#define ENOSPC          28      /* No space left on device */
#define ESPIPE          29      /* Illegal seek */
#define EROFS           30      /* Read-only file system */
#define EMLINK          31      /* Too many links */
#define EPIPE           32      /* Broken pipe */
#define EDOM            33      /* Math argument out of domain of func */
#define ERANGE          34      /* Math result not representable */

#define EDEADLK         35      /* Resource deadlock would occur */
#define ENAMETOOLONG    36      /* File name too long */
#define ENOLCK          37      /* No record locks available */
#define ENOSYS          38      /* Function not implemented */
#define ENOTEMPTY       39      /* Directory not empty */
#define ELOOP           40      /* Too many symbolic links encountered */
#define EWOULDBLOCK     EAGAIN  /* Operation would block */
#define ENOMSG          42      /* No message of desired type */
#define EIDRM           43      /* Identifier removed */
#define ECHRNG          44      /* Channel number out of range */
#define EL2NSYNC        45      /* Level 2 not synchronized */
#define EL3HLT          46      /* Level 3 halted */
#define EL3RST          47      /* Level 3 reset */
#define ELNRNG          48      /* Link number out of range */
#define EUNATCH         49      /* Protocol driver not attached */
#define ENOCSI          50      /* No CSI structure available */
#define EL2HLT          51      /* Level 2 halted */
#define EBADE           52      /* Invalid exchange */
#define EBADR           53      /* Invalid request descriptor */
#define EXFULL          54      /* Exchange full */
#define ENOANO          55      /* No anode */
#define EBADRQC         56      /* Invalid request code */
#define EBADSLT         57      /* Invalid slot */

#define EDEADLOCK       EDEADLK

#define EBFONT          59      /* Bad font file format */
#define ENOSTR          60      /* Device not a stream */
#define ENODATA         61      /* No data available */
#define ETIME           62      /* Timer expired */
#define ENOSR           63      /* Out of streams resources */
#define ENONET          64      /* Machine is not on the network */
#define ENOPKG          65      /* Package not installed */
#define EREMOTE         66      /* Object is remote */
#define ENOLINK         67      /* Link has been severed */
#define EADV            68      /* Advertise error */
#define ESRMNT          69      /* Srmount error */
#define ECOMM           70      /* Communication error on send */
#define EPROTO          71      /* Protocol error */
#define EMULTIHOP       72      /* Multihop attempted */
#define EDOTDOT         73      /* RFS specific error */
#define EBADMSG         74      /* Not a data message */
#define EOVERFLOW       75      /* Value too large for defined data type */
#define ENOTUNIQ        76      /* Name not unique on network */
#define EBADFD          77      /* File descriptor in bad state */
#define EREMCHG         78      /* Remote address changed */
#define ELIBACC         79      /* Can not access a needed shared library */
#define ELIBBAD         80      /* Accessing a corrupted shared library */
#define ELIBSCN         81      /* .lib section in a.out corrupted */
#define ELIBMAX         82      /* Attempting to link in too many shared libraries */
#define ELIBEXEC        83      /* Cannot exec a shared library directly */
#define EILSEQ          84      /* Illegal byte sequence */
#define ERESTART        85      /* Interrupted system call should be restarted */
#define ESTRPIPE        86      /* Streams pipe error */
#define EUSERS          87      /* Too many users */
#define ENOTSOCK        88      /* Socket operation on non-socket */
#define EDESTADDRREQ    89      /* Destination address required */
#define EMSGSIZE        90      /* Message too long */
#define EPROTOTYPE      91      /* Protocol wrong type for socket */
#define ENOPROTOOPT     92      /* Protocol not available */
#define EPROTONOSUPPORT 93      /* Protocol not supported */
#define ESOCKTNOSUPPORT 94      /* Socket type not supported */
#define EOPNOTSUPP      95      /* Operation not supported on transport endpoint */
#define EPFNOSUPPORT    96      /* Protocol family not supported */
#define EAFNOSUPPORT    97      /* Address family not supported by protocol */
#define EADDRINUSE      98      /* Address already in use */
#define EADDRNOTAVAIL   99      /* Cannot assign requested address */
#define ENETDOWN        100     /* Network is down */

#define ENETUNREACH     101     /* Network is unreachable */
#define ENETRESET       102     /* Network dropped connection because of reset */
#define ECONNABORTED    103     /* Software caused connection abort */
#define ECONNRESET      104     /* Connection reset by peer */
#define ENOBUFS         105     /* No buffer space available */
#define EISCONN         106     /* Transport endpoint is already connected */
#define ENOTCONN        107     /* Transport endpoint is not connected */
#define ESHUTDOWN       108     /* Cannot send after transport endpoint shutdown */
#define ETOOMANYREFS    109     /* Too many references: cannot splice */
#define ETIMEDOUT       110     /* Connection timed out */
#define ECONNREFUSED    111     /* Connection refused */
#define EHOSTDOWN       112     /* Host is down */
#define EHOSTUNREACH    113     /* No route to host */
#define EALREADY        114     /* Operation already in progress */
#define EINPROGRESS     115     /* Operation now in progress */
#define ESTALE          116     /* Stale NFS file handle */
#define EUCLEAN         117     /* Structure needs cleaning */
#define ENOTNAM         118     /* Not a XENIX named type file */
#define ENAVAIL         119     /* No XENIX semaphores available */
#define EISNAM          120     /* Is a named type file */
#define EREMOTEIO       121     /* Remote I/O error */
#define EDQUOT          122     /* Quota exceeded */

#define ENOMEDIUM       123     /* No medium found */
#define EMEDIUMTYPE     124     /* Wrong medium type */
#define ECANCELED       125     /* Operation Canceled */
#define ENOKEY          126     /* Required key not available */
#define EKEYEXPIRED     127     /* Key has expired */
#define EKEYREVOKED     128     /* Key has been revoked */
#define EKEYREJECTED    129     /* Key was rejected by service */

/* for robust mutexes */
#define EOWNERDEAD      130     /* Owner died */
#define ENOTRECOVERABLE 131     /* State not recoverable */

#define ERFKILL         132     /* Operation not possible due to RF-kill */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
perl函数手册英文版 Perl提供了可以直接调用的、数目众多的函数。可以对以下对象进行操作: 数组:chomp, join, keys, map, pop, push, reverse, shift, sort, splice, split, unshift, values 数据库:dbmclose, dbmopen 目录:chdir, closedir, mkdir, opendir, readdir, rewinddir, rmdir, seekdir, telldir 文件:binmode, chdir, chmod, chown, chroot, close, eof, fnctl, fileno, flock, getc, glob, ioctl, link, lstat, open, print, printf, read, readdir, readlink, rename, rmdir, seek, select, stat, symlink, sysopen, sysread, syswrite, tell, truncate, umask, unlink, utime, write 组:endgrent, getgrent, getgrgid, getgrname, getpgrp, setgrent, setpgrp Hash: delete, each, exists, keys, values 主机:endhostent, gethostbyaddr, gethostbyname, sethostent 输入:getc, read, sysread 处理器间通讯:msgctl, msgget, msgrcv, msgsnd, pipe, semctl, semget, semop, shmctl, shmget, hmread, shmwrite 数学:abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt, srand 消息队列:msgctl, msgget, msgrcv, msgsnd 其他:bless, defined, do, eval, formline, import, ref, scalar, syscall, tie, tied, undef, untie, wantarray 网络:endnetent, getnetbyaddr, getnetbyname, getnetent, setnetent 输出:die, print, printf, syswrite, warn, write 口令:endpwent, getpwent, getpwname, getpwuid, setpwent 进程:alarm, die, dump, exec, exit, fork, getlogin, getpgrp, getppid, getpriority, kill, setpriority, sleep, system, times, umask, wait, waitpid 协议:endprotent, getprotobyname, getprotobynumber, getprotoent, getservbyname, getservbyport, getservent, setprotoent 正则表达式:grep, pos, quotemeta, reset, split, study 范围:caller, local, my 服务:endservent, getservbyname, getservbyport, getservent, setservent 套节字:accept, bind, connect, gethostbyaddr, gethostbyname, gethostent, getpeername, getservbyname, getservbyport, getservent, getsockname, getsockopt, listen, recv, select, send, setsockopt, shutdown, socket, socketpair 字符串:chop, chr, crypt, hex, index, join, lc, lcfirst, length, oct, Ord, pack, q, qq, quotemeta, qw, qx, reverse, rindex, split, sprintf, substr, uc, ucfirst, unpack, vec 间:gmtime, localtime, time UNIX: chmod, chown, chroot, dump, endgrent, endhostent, endnetent, endprotent, endpwent, endservent, fnctl, fork, getgrent, getgrgid, getgrname, gethostent, getlogin, getnetent, getpgrp, getppid, getpriority, getprotobyname, getprotobynumber, getprotoent, getpwent, getpwname, getpwuid, getservbyname, getservbyport, getservent, ioctl, link, lstat, readlink, select, setgrent, sethostent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setservent, sleep, syscall, times, umask, wait, waitpid
### 回答1: semget函数是Unix/Linux系统中的一个系统调用函数,用于获取一个信号量集的标识符(也称为信号量集ID)。它通常与其他信号量函数(如semop、semctl)一起使用,用于实现进程间同步和互斥。 semget函数的调用格式为: ``` #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key_t key, int nsems, int semflg); ``` 其中,key是唯一的键值,用于标识信号量集;nsems指定信号量集中信号量的数量;semflg是标志位,指定semget函数的行为。 semget函数的返回值是一个非负整数,即信号量集的标识符,如果出现错误则返回-1。可以通过该标识符对信号量集进行操作,如设置信号量的值、等待信号量、释放信号量等。 需要注意的是,使用信号量集前需要对其进行初始化,可以使用semctl函数进行初始化操作。同,在使用完信号量集后,应该使用semctl函数将其删除,避免出现资源泄漏的问题。 ### 回答2: semget函数是在Linux中用于创建或获取一个信号量集的函数。它的函数原型为: int semget(key_t key, int nsems, int semflg); 参数key是唯一标识一个信号量集的键值,可以使用ftok函数生成。参数nsems指定需要创建的信号量数量。参数semflg可以控制信号量集的访问权限和其他操作标志。 当调用semget函数,它会检查指定键值的信号量集是否已经存在。如果存在,则返回该信号量集的标识符(即信号量集的ID)。如果不存在,则根据指定的键值和信号量数量创建一个新的信号量集,并返回新创建的信号量集的ID。 semget函数返回的ID可以用于后续的信号量操作函数,如semop,用于对信号量集进行加减操作。多个进程可以通过该ID共享对信号量集的访问。在使用完信号量集后,可以使用semctl函数对其进行删除或控制其他属性。 通常,semget函数的返回值为正数表示成功,返回值为-1表示失败。失败的原因可能是给定的键值无效、对信号量集的数量进行了非法的操作等。 总的来说,semget函数是用于创建或获取信号量集的函数。它通过键值来标识一个信号量集,并返回一个标识符用于后续对其进行操作。通过信号量集,可以实现进程间的同步与互斥,实现进程间共享资源的控制。 ### 回答3: semget函数是Linux系统中用于创建或获取一个信号量集的函数。该函数的主要功能是根据给定的key值和标志位创建一个新的信号量集,或者根据给定的key值和标志位获取已存在的信号量集的标识符。 函数原型为: int semget(key_t key, int nsems, int semflg); 其中,key是一个键值,用来唯一标识一个信号量集,nsems是信号量集中信号量的数量,semflg是标志位,在创建新的信号量集指定该信号量集的权限以及其他的一些标志。 semget函数的返回值是一个整型的信号量集标识符,用于后续对该信号量集进行操作。 当调用semget函数,会根据给定的key值以及标志位进行以下操作: 1. 如果给定的key对应的信号量集已存在,则semget函数会返回该信号量集的标识符。 2. 如果给定的key对应的信号量集不存在,且同指定了IPC_CREAT标志,则semget函数会创建一个新的信号量集,并返回其标识符。 3. 如果给定的key对应的信号量集不存在,并且没有指定IPC_CREAT标志,则semget函数会返回一个错误。 通常,semget函数与其他的信号量操作函数(如semop、semctl等)一起使用,用于对信号量集进行锁定、释放等操作。 总之,semget函数是Linux系统中用于创建或获取信号量集的函数,通过给定的key值和标志位,可以创建新的信号量集或获取已存在的信号量集的标识符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值