怎么修改linux中sem的值

怎么修改linux中sem的值,第1张

semget() 可以使用系统调用semget()创建一个新的信号量集,或者存取一个已经存在的信号量集:

系统调用: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


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/194940.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-31
下一篇2023-03-31

发表评论

登录后才能评论

评论列表(0条)

    保存