Tag: posix

POSIX定时器:定时器的信号处理程序冻结

这篇文章与以下内容有关: POSIX TIMER-有多个计时器 我想在SignalHandler中调用一个函数。 此函数是TCP套接字客户端(getSpeed)。 每次计时器滴答一秒钟时它从服务器获取数据并发送一个信号,然后调用相应的处理程序。 首先,我不确定从信号处理程序调用函数是否是一个好习惯。 现在问题是,每当我执行与服务器通信的程序时,我的代码就会随机冻结。 如果这种使用信号定义计时器的方式很糟糕(并且可能导致一些隐藏的竞争条件)是否有更好的方法来编码上述场景? #include #include #include #include #include #include #include #include static timer_t tid; static timer_t tid2; void SignalHandler(int, siginfo_t*, void* ); timer_t SetTimer(int, int, int); int getSpeed(void) { int sockFD = 0; struct sockaddr_in addr; int numbytes; unsigned char rxMsg[128]; /* open socket */ if((sockFD = socket(AF_INET, SOCK_STREAM, […]

定义EOF字符

出于好奇,可以暂时添加一个应该被解释为EOF的角色吗? 例如,在循环中使用read()系统调用,并通过暂时将新行字符注册为EOF使其在’\n’上中止。

理解fork()命令Posix API

#include #include #include using namespace std; int main() { fork(); fork(); fork(); fork(); printf(“*”); /*This prints 16 stars*/ return 0; } 使用fork() ,为什么打印16 *? 我知道fork()生成一个新的子进程,它们都执行相同的进程,这可以解释为什么一个fork生成2个星,但是,有四个forks它打印16个,我可以看到它与每个fork()加倍。 但我不明白为什么。 每个fork是否执行下面的函数和参数?

getaddrinfo:如果指定了节点名,AI_PASSIVE会以什么方式被忽略?

引用getaddrinfo的规范: 如果指定了AI_PASSIVE标志,则返回的地址信息应适合用于绑定套接字以接受指定服务的传入连接。 在这种情况下,如果nodename参数为null,则套接字地址结构的IP地址部分应设置为INADDR_ANY对于IPv4地址)或IN6ADDR_ANY_INIT (IPv6地址)。 这是有道理的。 如果指定AI_PASSIVE ,则可以在返回的地址上bind() / listen() / accept() 。 如果nodename为null,则返回的地址将绑定到所有网络接口,因此您可以使用任何计算机的IP地址(例如,以太网LAN IP,Wi-Fi LAN IP,环回地址等)。 摘要:在服务器上使用AI_PASSIVE (对于TCP套接字)。 继续: 如果未指定AI_PASSIVE标志,则返回的地址信息应适合于调用connect() (用于连接模式协议)或调用connect() , sendto()或sendmsg() (用于无连接协议)。 在这种情况下,如果nodename参数为null,则套接字地址结构的IP地址部分应设置为环回地址。 这也是有道理的。 如果未指定AI_PASSIVE ,则可以在返回的地址上connect() / sendto() / sendmsg() 。 如果nodename为null,则获取环回地址。 简介: 不要在客户端上使用AI_PASSIVE (对于TCP套接字)。 继续: 如果nodename参数不为null,则应忽略AI_PASSIVE标志。 咦? 忽略 AI_PASSIVE标志甚至意味着什么? 从前两个引号来看,听起来AI_PASSIVE仅用于确定您是否获得适合服务器/客户端使用的地址,并且在这两种情况下,它听起来像一个null nodename只是为您提供INADDR_ANY地址(用于服务器)或环回地址(对于客户)。 忽略 AI_PASSIVE标志有什么用呢? 这最后一句话的真正含义是什么? 它如何影响前两个引号?

信号执行期间的sigprocmask

我正在研究使用sigprocmask来阻止某些关键代码段执行时的某些信号(在本例中为SIGALRM和SIGCHLD )。 与这些信号相关联的两个信号处理程序都将访问和修改中央数据结构,因此在主进程处理它时阻止它们访问它是至关重要的。 目前,我的计划是在代码的关键部分开始时简单地禁用这些信号,然后在最后重新启用它们。 void criticalFunction(void) { // disable signals with sigprocmask // critical code // enable signals with sigprocmask } 但是,要阻塞的信号的信号处理程序也会调用criticalFunction 。 当他们调用sigprocmask函数并对自己的信号启用阻塞时会发生什么? 他们会停止还是继续执行? (或者某些第三个条件..) 我能找到的唯一一个注意事项如下: 如果在信号处理程序中调用sigprocmask(),则从处理程序返回可以通过恢复原始挂起信号掩码来撤消sigprocmask()的工作。 ( http://www.mkssoftware.com/docs/man3/sigprocmask.3.asp ) (这是我上一个问题的后续问题: 信号处理程序访问队列数据结构(竞争条件?) )

sem_wait不能在基本代码中工作

用gcc编译。 我跑了这个,看看为什么我在其他程序中使用的信号量不能正常工作。 我只是错误地使用这些或者什么? 即使信号量应该停止执行并导致死锁,每次输出字符串,对吧? 这是代码: #include #include #include #define NUM_THREADS 5 void printHello(); int main(){ int i; pthread_t threads[NUM_THREADS]; sem_t sem1; sem_init(&sem1, 0, 0); sem_wait(&sem1); for(i = 0; i < NUM_THREADS; i++){ pthread_create(&threads[i], NULL, &printHello, NULL); } sem_destroy(&sem1); pthread_exit(NULL); return 0; } void printHello(){ printf("sem_wait failed\n"); } 当我试图掌握整个multithreading概念时,任何帮助都会受到高度赞赏。 谢谢!

为什么有些POSIX函数会获得元素编号和元素大小参数?

请参阅: http : //pubs.opengroup.org/onlinepubs/009695399/functions/malloc.html malloc函数只是获取要分配的数组大小。 但是: http : //pubs.opengroup.org/onlinepubs/009695399/functions/calloc.html 并且: http : //pubs.opengroup.org/onlinepubs/009695399/functions/fread.html 只是两个接收元素大小和元素数量的函数示例。 为什么会有这种差异? 获得尺寸不是更简单吗?

如何与其他进程共享现有的char *?

我正在尝试使用shmget和shmat与其他forked + execed进程共享一些内存: char test[]=”test”; int shID; char *shptr; key_t shkey = 2404; shID = shmget(shkey, sizeof(char)*(strlen(test)+1), IPC_CREAT | 0666); if (shID >= 0) { shptr = shmat(shID, 0, 0); if (shptr==(char *)-1) { perror(“shmat”); } else { memcpy(shptr, &test, strlen(test)+1); …. //forking and execing …. shmdt(shptr); } } else { perror(“shmget”); } 这很好用。 问题是test[]将成为一个巨大的char* […]

IPv4到十进制的不同值?

为什么IPv4的十进制值与inet_pton和inet_addr(1734763876)不同,如果您使用这两个网站(1684366951)? struct sockaddr_in sin; inet_pton(AF_INET, “100.101.102.103”, &(sin.sin_addr)); printf(“%i\n%i\n”, inet_addr(“100.101.102.103”), sin.sin_addr); http://www.allredroster.com/iptodec.htm http://www.ipaddresslocation.org/convertip.php

为什么应用程序无法访问来自共享库的malloc内存?

我维护一个用C语言编写的库,用户可以在Linux上直接从Python使用加载共享库和调用函数的模块访问。 该模块是非常常用的,正如这个版本的共享库一样,人们在做一个流行的教程 。 用户正在获得分段错误。 在gdb下运行他的Python脚本,他发现它位于共享库中,在一个函数内,为一个结构的mallocs内存并返回指针。 他正在返回指针,但当他尝试在后续调用共享库时使用它时,会发生分段错误,因为内存不可访问。 如果他以root身份运行Python脚本,则不会发生此问题。 它也不会出现在备用Linux安装中。 所以回顾一下: 他的Python代码加载了共享库。 然后它调用一个函数,该函数返回指向共享库中分配的内存的指针。 然后他调用共享库中的另一个函数,并传入它返回给他的指针,共享库扼杀它自己的指针。 它只发生在“4.0.7-2-ARCH x86_64 GNU / Linux”上作为普通用户运行时。 当他切换到root并运行它时,该操作系统上不会发生这种情况。 当他试图在Ubuntu机器上重现问题时不会发生这种情况。 是什么赋予了? 这是一些ARCH错误吗? 或者是否存在可以清除的编程细微差别? 您可以在这里阅读细节,其中包含足够的细节来重现问题,如果问题对于具有比我更多Linux编程经验的用户来说不是不言而喻的。 指向共享库函数的快速链接: TCOD_map_new的源代码。 TCOD_map_set_properties的源代码。 他的Python代码摘录为后代和易于访问: #!/usr/bin/env python2 import curses import libtcodpy as libtcod def main(stdscr): curses.start_color() curses.use_default_colors() map = libtcod.map_new(10, 10) # any numbers work libtcod.map_set_properties(map, 0, 0, True, True) # any in […]