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);
}