系统调用:semget()
原型:intsemget(key_t key,int nsems,int semflg)
返回值:如果成功,则返回信号量集的IPC标识符。如果失败,则返回-1:errno=EACCESS(没有权限)
EEXIST(信号量集已经存在,无法创建)
EIDRM(信号量集已经删除)
ENOENT(信号量集不存在,同时没有使用IPC_CREAT)
ENOMEM(没有足够的内存创建新的信号量集)
ENOSPC(超出限制)
系统调用semget()的第一个参数是关键字值(一般是由系统调用ftok()返回的)。系统内核将此值和系统中存在的其他的信号量集的关键字值进行比 较。打开和存取操作与参数semflg中的内容相关。IPC_CREAT如果信号量集在系统内核中不存在,则创建信号量集。IPC_EXCL当和 IPC_CREAT一同使用时,如果信号量集已经存在,则调用失败。如果单独使用IPC_CREAT,则semget()要么返回新创建的信号量集的标识 符,要么返回系统中已经存在的同样的关键字值的信号量的标识符。如果IPC_EXCL和IPC_CREAT一同使用,则要么返回新创建的信号量集的标识 符,要么返回-1。IPC_EXCL单独使用没有意义。参数nsems指出了一个新的信号量集中应该创建的信号量的个数。信号量集中最多的信号量的个数是 在linux/sem.h中定义的:
void __bzero (void *s, size_t len)/*
将s的前len字节设为0
思路:先对齐到4的倍数的地址上,对前面的几B直接赋。然后,每次赋个32B,剩余凑不够32B的,
每次赋4B,剩余凑不够4B的,直接赋
*/
void __bzero (void *s, size_t len)
{
long int dstp = (long int) s
const op_t zero = 0
if (len >= 8)
{
size_t xlen
// 处理前面的几B,直到地址为4的倍数,然后可以每次4B
// 这样做的原因与结构体对齐的原因一样,是为提高读写数据的效率
// 由于len >= 8 ,OPSIZ=4,所以不必担心len==0
while (dstp % OPSIZ != 0) // #define op_t unsigned long int
// #define OPSIZ (sizeof(op_t))
// IA-32下是32
{
((byte *) dstp)[0] = 0
dstp += 1
len -= 1
}
// 下面是典型的循环展开以提高效率,每次32B
// 若每次赋一个4B,程序会由于跳转太多而打断cpu流水线,降低效率
// http://www.lysator.liu.se/c/duffs-device.html
// 关键字:Duff's Device
xlen = len / (OPSIZ * 8)
while (xlen != 0)
{
((op_t *) dstp)[0] = zero
((op_t *) dstp)[1] = zero
((op_t *) dstp)[2] = zero
((op_t *) dstp)[3] = zero
((op_t *) dstp)[4] = zero
((op_t *) dstp)[5] = zero
((op_t *) dstp)[6] = zero
((op_t *) dstp)[7] = zero
dstp += 8 * OPSIZ
xlen -= 1
}
len %= OPSIZ * 8 // 剩余的凑不足8 op_t 的
xlen = len / OPSIZ
while (xlen != 0) // 每次填4B
{
((op_t *) dstp)[0] = zero
dstp += OPSIZ
xlen -= 1
}
len %= OPSIZ
}
while (len != 0)// 剩余不够4B的,直接赋值
{
((byte *) dstp)[0] = 0
dstp += 1
len -= 1
}
}
在 Linux 中修复闪存盘或其它类型驱动器简单的方法就是使用 fsck 工具,在此前需要先使用 lsblk 命令来确定好 U 盘,该命令可以列出当前 Linux 系统上连接的所有磁盘。要删除坏文件块,请在特定分区或整块磁盘上执行 fsck 命令, 一旦完成,你将获得一个健康的 Linux 分区。当出现 U 盘已经完全不可读,里面的数据也无价值时,佳的修复办法就是使用 dd 命令将 U 盘完全清零。同样先使用 lsblk 命令找出 U 盘,再使用类似如下命令进行清零处理:
sudo dd if=/dev/zero of=/dev/sdb。清零操作完成后,需要用 fdisk 或其它工具对磁盘进行重新分区,之后再选择如下命令格式化之后即可正常使用:FAT32 sudo mkfs.msdosf 32 /dev/sdb1 EXT4sudo mkfs.ext4 -f /dev/sdb1 NTFS sudo mkfs.ntfs -f /dev/sdb1
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)