是否有任何可移植的方式(在POSIX系统上)来确定文件描述符是否可搜索?我的想法是使用lseek(fd, 0, SEEK_CUR);并检查返回值是否为-1,但我不确定这是否会给出假阴性或误报.使用fstat和假设哪些类型的文件是可搜索/不可搜索的并不是一个好主意.还有其他想法吗?
如何在Interix平台上编译 /使用信号?我无法将其编译,因为Interix似乎与非POSIX兼容,至少在其实现中是这样.signal.h
如果有人找到了一种方法来解决这个问题,并允许代码在Interix上编译信号,请告诉我如何!
谢谢.
C,C++中的传统软件,基于Linux和Interix构建(适用于Win XP).
在编译期间,仅在Interix上出现以下错误; 在添加pthread和signal代码之后,不在Linux上.pthreads由于与Xmotif冲突(编译但在运行时崩溃),因此无法在没有信号的情况下使用.
结构差异引起的错误:
`struct siginfo' has no member named `si_value'
aggregate `sigval val' has incomplete type and cannot be defined
`struct sigaction' has no member named `sa_sigaction'
Run Code Online (Sandbox Code Playgroud)
未申报的错误:
`sigqueue' undeclared
`SA_NODEFER' undeclared
`SA_SIGINFO' undeclared
Run Code Online (Sandbox Code Playgroud)
http://www.mail-archive.com/bug-gnulib@gnu.org/msg10425.html
http://www.gnu.org/software/hello/manual/gnulib/signal_002eh.html
HTTP:// EN. wikipedia.org/wiki/Interix
http://www.opengroup.org/susv3xbd/signal.h.html
我必须编写一个多线程(比如2个线程)程序,其中每个线程执行不同的任务.此外,这些线程一旦启动就必须在后台无限运行.这就是我所做的.有人可以给我一些反馈,如果方法是好的,如果你看到一些问题.另外,我想知道如果用Ctrl + C终止执行,如何以系统的方式关闭线程.
main函数创建两个线程,让它们无限运行,如下所示.
这是骨架:
void *func1();
void *func2();
int main(int argc, char *argv[])
{
pthread_t th1,th2;
pthread_create(&th1, NULL, func1, NULL);
pthread_create(&th2, NULL, func2, NULL);
fflush (stdout);
for(;;){
}
exit(0); //never reached
}
void *func1()
{
while(1){
//do something
}
}
void *func2()
{
while(1){
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
使用答案中的输入编辑代码: 我是否正确退出线程?
#include <stdlib.h> /* exit() */
#include <stdio.h> /* standard in and output*/
#include <pthread.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <signal.h>
#include <semaphore.h>
sem_t end; …Run Code Online (Sandbox Code Playgroud) 我想知道调用pthread_cancel()终止线程是否安全.我在手册页中找不到任何提示.提前感谢任何提示.
编辑:也许我不够准确.我不是在讨论由早期的pthread_cancel()终止的线程,而是关于只是从它们的线程函数返回的线程.
我即将把一个大型的C++项目(某种类型的Library Project,它完全没有GUI)移植到Android上.它实际上是一个Visual C++项目,但它将作为中间步骤移植到Linux.我知道Android并不是一个"完整"的Linux,也没有声称提供所有POSIX功能,但我也知道在Android上有很多使用NDK的"POSIXish功能".
现在我的实际问题是:
与完整的POSIX集相比,哪些是Android上最不重要/最重要的功能?因此,在从Visual C++移植到Linux GCC时,我可以牢记这一点.
我试图在谷歌上找到一些东西,但没有发现任何真正有用的东西,只是在这里和那里有一些东西提到Android上有一些POSIX功能......
man pipe -s7文件很好地写入管道.对我来说重要的部分是,如果设置了O_NONBLOCK,写入只会部分完成,并且写入长度大于PIPE_BUF.
但是,关于读取结束没有任何说法.
我在写端以阻塞模式通过管道发送表示事件的结构.在读取结束时,我正在非阻塞模式下的更新循环中处理这些事件(和其他事物).
由于我的结构小于PIPE_BUF,所以会读取ALWAYS读取整数个结构吗?或者我是否需要处理只读部分结构的可能性?
常识告诉我,读取行为将反映记录的写入行为,但如果指定了这一点,我会更高兴.
我正在使用Linux(内核3.8,x86_64).但重要的是我的代码可以跨不同的UNIX风格和CPU架构移植.
谢谢.克里斯.
我经常看到代码通过测试小于零而不是显式定义来检查来自POSIX函数的错误,并且通常只使用错误代码-1.那是
ret = function();
if (ret < 0) {
...
}
Run Code Online (Sandbox Code Playgroud)
VS
ret = function();
if (ret == -1) {
...
}
Run Code Online (Sandbox Code Playgroud)
第一次练习有什么目的吗?在某些体系结构上比0与-1比较的速度要快吗?如果现在定义的唯一错误代码是-1,C或POSIX标准是否可以保证第一个替代方案将来不会中断?如果没有,是否应该被视为不良做法?(我想大多数函数不太可能以这种方式改变,导致很多已编写的代码破坏?).
编辑:使问题更清楚:我只谈论专门返回-1的函数作为标准定义的错误代码.我知道有一些没有.我在很多地方看到了<0检查这些函数而不是== -1.因此问题.
POSIX.1 2008 指定了setrlimit()和getrlimit()函数.为resource论证提供了各种常数,其中一些常规在下面复制,以便更容易理解我的问题.
定义了以下资源:
(......)
RLIMIT_DATA
这是进程数据段的最大大小(以字节为单位).如果超出此限制,则malloc()函数将失败,并将errno设置为[ENOMEM].
(......)
RLIMIT_STACK
这是初始线程堆栈的最大大小(以字节为单位).实现不会自动使堆栈超出此限制.如果超出此限制,则应为该线程生成SIGSEGV.如果线程阻塞SIGSEGV,或者进程忽略或捕获SIGSEGV并且没有安排使用备用堆栈,则SIGSEGV的处置应在生成之前设置为SIG_DFL.
RLIMIT_AS
这是进程总可用内存的最大大小(以字节为单位).如果超出此限制,则malloc()和mmap()函数将失败,并将errno设置为[ENOMEM].此外,自动堆栈增长失败,具有上述效果.
此外,POSIX.1 2008 定义了这样的 数据段:
3.125数据段
与进程关联的内存,可以包含动态分配的数据.
据我所知,该RLMIT_DATA资源传统上用于表示可以使用该brk()功能分配给进程的最大内存量.最新版本的POSIX.1不再指定此功能,许多操作系统(例如Mac OS X)不支持此功能作为系统调用.相反,它的模拟版本mmap()不属于POSIX.1 2008.
我对RLIMIT_DATA资源的语义和使用有点困惑.以下是我的具体问题:
根据此规范,堆栈是否可以成为数据段的一部分?
该标准说,有关RLIMIT_DATA:"如果超过这个限制,malloc()函数的功能应errno设置为[ENOMEM]失败"这是否意味着与分配的内存malloc()必须是数据段的一部分?
在Linux上,分配的内存mmap()不计入数据段.只有内存分配brk()或是sbrk()数据段的一部分.最新版本的glibc使用一个malloc()实现来分配其所有内存mmap().RLIMIT_DATA因此,这个值对使用此实现可以分配的内存量没有影响malloc().
这违反了POSIX.1 2008吗?
其他平台表现出类似的行为吗?
该标准说RLIMIT_AS:"如果超出此限制,malloc()和mmap()函数将失败,并将errno设置为[ENOMEM]." 由于mmap()没有指定失败RLIMIT_DATA,我得出结论,从中获得的内存mmap()不计入数据段.
这个假设是真的吗?这仅适用于非POSIX变体mmap()吗?
在REPL中,我们通常可以使用sigint(即ctrl+)中断无限循环c,并在解释器中重新获得控制权.
>>> while True: pass
...
^CTraceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyboardInterrupt
>>>
Run Code Online (Sandbox Code Playgroud)
但是在这个循环中,中断似乎被阻止了,我必须杀死父进程才能逃脱.
>>> *x, = itertools.repeat('x')
^C^C^C^C^C^C^C^C^\^\^\^\^\^Z^Z^Z^Z
Run Code Online (Sandbox Code Playgroud)
这是为什么?
在研究Adaptive AUTOSAR时,我发现'Adaptive AUTOSAR基于POSIX PSE51'.
但是,我不明白什么是POSIX PSE51.
有人可以回答这个问题吗?
我想知道以下......