导航:首页 > 网络营销 > syssemh

syssemh

发布时间:2020-08-30 15:59:53

1、linux C编程 信号量sys/sem 有等待超时么

可以用semtimedop

2、怎么设置linux 信号量 超时

信号量在进程是以有名信号量进行通信的,在线程是以无名信号进行通信的,因为线程linux还没有实现进程间的通信,所以在sem_init的第二个参数要为0,而且在多线程间的同步是可以通过有名信号量也可通过无名信号,但是一般情况线程的同步是无名信号量,无名信号量使用简单,而且sem_t存储在进程空间中,有名信号量必须LINUX内核管理,由内核结构struct ipc_ids 存储,是随内核持续的,系统关闭,信号量则删除,当然也可以显示删除,通过系统调用删除,
消息队列,信号量,内存共享,这几个都是一样的原理。,只不过信号量分为有名与无名

无名使用 <semaphore.h>,
有名信号量<sys/sem.h>
无名信号量不能用进程间通信,
//无名与有名的区别,有名需要KEY值与IPC标识
所以sem_init的第二个参数必须为0,

3、linux/sem.h和sys/sem.h有什么区别

你好。

不只是sem.h,很多头文件都有/usr/include/linux和/usr/include/sys两个版本。

我的印象是:linux目录里面的头文件用于内核,

sys目录里面的头文件用于应用程序或者glibc标准库

如果我的回答没能帮助您,请继续追问。

4、C语言单链表

C语言创建单链表如下:

#include"stdio.h"

#include"stdlib.h"

#include"malloc.h"

#include "iostream.h"

typedef struct node

{

int  data;

node * next;

}node , * List;

void create(int n)

{

int c;

List s,L;

L=(List)malloc(sizeof(node));

L->next=NULL;

printf("请输入第1个数据:");

scanf("%d",&c);

L->data=c;

for(int i=2;i<=n;i++)

{

s=(List)malloc(sizeof(node));

printf("请输入第%d个数据:",i);

scanf("%d",&c);

s->data=c;

s->next=L;

L->next =s;

}

printf("链表创建成功!");

}

void main()

{

int n;

printf("请你输入链表的个数:");

scanf("%d",&n);

create(n);

}

5、c语言单链表

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include <errno.h>

#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>

#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <pthread.h>

typedef int datatype;

struct node
{
datatype data;
struct node *next;
};

struct node *init_list(void)
{
struct node *p = malloc(sizeof(struct node));
p->next = NULL;

return p;
}

void insert(int n, struct node *head)
{
// 创建一个新节点
struct node *new = malloc(sizeof(struct node));
new->data = n;
new->next = NULL;

// 找到单链表的最后一个节点
struct node *p = head;
while(p->next != NULL)
{
p = p->next;
}

// 将最后这个节点的next指向新节点
p->next = new;
}

void show(struct node *head)
{
struct node *p = head->next;

while(p != NULL)
{
printf("%d\t", p->data);
p = p->next;
}

printf("\n");
}

void inverse(struct node *head)
{
struct node *p, *q;
p = head->next;

head->next = NULL;

while(p != NULL)
{
q = p->next;
p->next = head->next;
head->next = p;

p = q;
}
}

int main(int argc, char **argv)
{
struct node *head;
head = init_list();

int n;
scanf("%d", &n);

int i;
for(i=1; i<=n; i++)
{
insert(i, head);
}
show(head);

inverse(head);
show(head);

return 0;
}

6、linux编程时的信号量问题。 我以前用过的信号量头文件是<semaphore.h>,而现在又发现还有个<sys/sem.h>

信号量在进程是以有名信号量进行通信的,在线程是以无名信号进行通信的,因为线程linux还没有实现进程间的通信,所以在sem_init的第二个参数要为0,而且在多线程间的同步是可以通过有名信号量也可通过无名信号,但是一般情况线程的同步是无名信号量,无名信号量使用简单,而且sem_t存储在进程空间中,有名信号量必须LINUX内核管理,由内核结构struct ipc_ids 存储,是随内核持续的,系统关闭,信号量则删除,当然也可以显示删除,通过系统调用删除,
消息队列,信号量,内存共享,这几个都是一样的原理。,只不过信号量分为有名与无名

无名使用 <semaphore.h>,
有名信号量<sys/sem.h>
无名信号量不能用进程间通信,
//无名与有名的区别,有名需要KEY值与IPC标识
所以sem_init的第二个参数必须为0,,,,

7、在虚拟机里运行这段代码出错(unbuntu 12.04)

这里的mutex指针是野指针,
你应该写sem_t mutex;
然后 sem_init(&mutex, 1, 1);
sem_post(&mutex);
试一下,我没试,应该是不会出现Segmentation fault;

8、Linux下怎样检测进程是否异常

#include <sys/io.h>
#include <sys/ipc.h>
#include <sys/timeb.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/sysinfo.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/msg.h>
void CheckPid(void)
{
pid_t termpid;
int flags;
termpid = waitpid(-1,&flags,WNOHANG);
if (termpid>0)
{
msglog.code = LOG_MSG_OTHER;
if(WIFEXITED(&flags))
{
printf("pid=%d的子进程正常结束,返回信息=%d,结束状态=%d\n",termpid,flags,WEXITSTATUS(&flags));
}
else if(WIFSIGNALED(&flags))
{
printf("pid=%d的子进程异常终止,返回信息=%d,终止进程的信号的编号=%d\n",termpid,flags,WTERMSIG(&flags));
}
else if(WIFSTOPPED(&flags))
{
printf("pid=%d的子进程暂停,返回信息=%d,暂停进程的信号的编号=%d\n",termpid,flags,WSTOPSIG(&flags));
}
else
{
printf_d(cur_dep,SYS_PID_DSC_OUTTYPE,"pid=%d的子进程退出",termpid);
}
}
}

其中“返回信息”flags的返回值有几种情况,如段错误、正常终止、 被信号终断等

9、linux 怎么查 信号量 被进程p住

sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享。
sem_wait:一直阻塞等待直到信号量>0。
sem_timedwait:阻塞等待若干时间直到信号量>0。
sem_post:使信号量加1。
sem_destroy:释放信号量。和sem_init对应。 答案补充 关于各函数的具体参数请用man查看,如man sem_init可查看该函数的帮助

信号量的工作原理
由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:
P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行
V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

举个例子,就是两个进程共享信号量sv,一旦其中一个进程执行了P(sv)操作,它将得到信号量,并可以进入临界区,使sv减1。而第二个进程将被阻止进入临界区,因为当它试图执行P(sv)时,sv为0,它会被挂起以等待第一个进程离开临界区域并执行V(sv)释放信号量,这时第二个进程就可以恢复执行。

Linux的信号量机制
Linux提供了一组精心设计的信号量接口来对信号进行操作,它们不只是针对二进制信号量,下面将会对这些函数进行介绍,但请注意,这些函数都是用来对成组的信号量值进行操作的。它们声明在头文件sys/sem.h中。

10、linux进程间信号量的初始信号

分配与初始化信号量是两个相互独立的操作。以 0 为第二参数,以 SETALL 为第三个参数调用 semctl 可以对一个信号量组进行初始化。第四个参数是一个 semun 对象,且它的 array 字段指向一个 unsigned short数组。数组中的每个值均用于初始化该组中的一个信号量。
代码 5.3 展示了初始化一个二元信号量的函数。
代码 5.3 (sem_init.c) 初始化一个二元信号量
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
/* 我们必须自己定义 union semun。*/
union semun
{
int val;
struct semid_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
};
/* 将一个二元信号量初始化为 1。*/
int binary_semaphore_initialize (int semid)
{
union semun argument;
unsigned short values[1];
values[0] = 1;
argument.array = values;
return semctl (semid, 0, SETALL, argument);
}

与syssemh相关的知识