Tag: posix

什么时候gcc __attribute __((构造函数))运行?

假设我有一个带有GCC构造函数的libA.so。 我的程序“程序”依赖于libA.so,所以当我运行它时,libA.so被打开并且它的构造函数被执行。 现在,我还有一个模块libC.so,它也依赖于libA。 我运行dlopen(“libC.so”) , 加载libC,并根据我的实验,也执行libA的构造函数 。 依赖关系看起来像这样: libA有构造函数 libB也有一个构造函数 libC依赖于libA和libB 程序取决于libA 程序通过dlopen()链接libC 现在,当我运行程序时: libA的构造函数在main()启动之前运行 libB的构造函数由dlopen()运行 显然,当它们被加载到内存中时,dlopen会执行库的构造函数。 这是在某处指定的,链接器如何检查哪些库已经加载? (为什么我要问:在一个场合,我有一个构造函数在一些不完全理解的情况下被执行了两次。我是否正确地假设这完全被打破并且在正常情况下不应该发生?)

发信号通知条件变量(pthreads)

假设某些条件变量“cond”与互斥变量“mutex”相关联。 如果线程在调用pthread_cond_wait(&cond,&mutex)后在cond上hibernate,并且另一个已锁定mutex锁的线程完成,那么该线程在调用pthread_mutex_unlock(&mutex)之前或之后是否调用pthread_cond_signal(&cond)是否重要? 如果调用pthread_cond_signal(&cond) ,它是否甚至需要解锁互斥锁,因为睡眠线程无论如何都会获取互斥锁? 编辑:根据https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview ,“调用pthread_cond_signal()后未能解锁互斥锁可能不允许匹配的pthread_cond_wait()例程完成(它将保持阻塞状态)。 “ 我想那时,解锁,也许只是之后才需要。

无法设置Pthread优先级

我无法使用pthread_attr_setschedparam()设置Pthread优先级。 我试图解决这个问题,但无法解决。 我还咨询了我的教科书,该教科书也使用相同的function。 我从书中复制了这段代码。 你能告诉我如何设置线程优先级吗? 这是代码: void *Func(void *arg); int main() { pthread_t tid[5]; pthread_attr_t *tattr; struct sched_param param; int pr,error,i; do { if( (tattr=(pthread_attr_t *)malloc(sizeof(pthread_attr_t)) )==NULL) { printf(“Couldn’t allocate memory for attribute object\n”); } }while(tattr==NULL); if(error=pthread_attr_init(tattr)) { fprintf(stderr,”Attribute initialization failed with error %s\n”,strerror(error)); } for(i=0;i<5;i++) { //scanf("%d",&pr); error = pthread_attr_getschedparam(tattr,&param); if(error!=0) { printf("failed to […]

睡眠/纳米睡眠是否通过忙碌的等待计划工作?

我想知道内部如何实现睡眠/纳米睡眠? 考虑以下代码: { // on a thread other than main() thread while(1) { //do something sleep(1); } } CPU是否会进行恒定的上下文切换以检查是否完成了1秒的睡眠(即内部忙等待)。 我怀疑这种方式是否有效,效率太低。 但那又如何运作? 同样的问题适用于nanosleep。 注意:如果这是特定于实现/操作系统的,那么我怎样才能实现一个不会导致上下文切换的更有效的方案呢?

写(2)是否总是写入小于或等于SSIZE_MAX?

write(2)的函数签名是ssize_t write(int fd, const void *buf, size_t count) 。 通常, size_t的最大值大于ssize_t 。 这是否意味着write实际可写的数据量实际上是SSIZE_MAX而不是SIZE_MAX ? 如果不是这种情况,当写入的字节数大于SSIZE_MAX时会发生什么情况? 我基本上想知道write的数据量是否受SSIZE_MAX或SIZE_MAX 。

是否为明确定义的相同文件描述符创建了两个FILE?

POSIX指定了一个fdopen函数,它为文件描述符创建一个FILE 。 POSIX还指定了一个fileno函数,该函数返回FILE文件描述符。 这两个可以一起用于创建第二个FILE访问与现有文件相同的底层文件描述符: FILE *secondfile(FILE *f, const char *mode) { int fd = fileno(f); return fd >= 0 ? fdopen(fd, mode) : NULL; } 这是POSIX下定义明确的操作吗? 当我访问原始FILE和我为同一文件描述符创建的第二个FILE时会发生什么? 是否指定了交互? 如果有,怎么样? 从历史上看,Unices为您打开的20个文件使用了固定的FILE结构表。 fdopen() ,在已经与FILE关联的文件描述符上调用fdopen()会破坏现有文件并产生未定义的行为。 我不确定POSIX是否仍允许这样的stdio实现,这就是我提出这个问题的原因。

pthread中的意外输出

你好上面的代码在线程中显示0(tid = 0)而不是8 …可能是什么原因? 在PrintHello函数中,我正在打印threadid,但是我发送值为8,但是输出为0 #include #include #include void *PrintHello(void *threadid) { int *tid; tid = threadid; printf(“Hello World! It’s me, thread #%d!\n”, *tid); pthread_exit(NULL); } int main(int argc, char *argv[]) { pthread_t thread1,thread2; int rc; int value = 8; int *t; t = &value; printf(“In main: creating thread 1”); rc = pthread_create(&thread1, NULL, PrintHello, […]

在C中使用共享内存的fibonacci序列

我有一个问题要解决,但它给了我错误: 2009-EE-182-Part2.c: In function ‘main’: 2009-EE-182-Part2.c:35:13: error: expected identifier or ‘(‘ before ‘->’ token 2009-EE-182-Part2.c:40:22: error: expected identifier or ‘(‘ before ‘->’ token 2009-EE-182-Part2.c:41:14: error: expected identifier or ‘(‘ before ‘->’ token 2009-EE-182-Part2.c:42:22: error: expected expression before ‘shared_data’ 2009-EE-182-Part2.c:44:15: error: expected identifier or ‘(‘ before ‘->’ token 2009-EE-182-Part2.c:54:15: error: expected expression before ‘shared_data’ 2009-EE-182-Part2.c:55:19: error: […]

抑制“ISO C99需要使用rest参数”

考虑以下两个宏: #define PNORM( v, s, … ) { \ if( VERBOSITY_CHECK( v ) ) { \ if( ( errno = pthread_mutex_lock(&server.output_mutex) ) ) { \ PERROR_LOCKFREE( normal, “\tpthread_mutex_lock failed on output_mutex.\r\n” ) ; \ } \ fprintf( stdout, s, ## __VA_ARGS__ ) ; \ fflush( stdout ) ; \ if( ( errno = pthread_mutex_unlock(&server.output_mutex) ) […]

是在线程安全的不同字节范围读取和写入同一文件?

我有一个名为“data.txt”的文件,总是有50个字节的数据。 我有两个主题。 第一个线程,从字节0到字节50读取内容: while(1){ char buf[50]; FILE* fp = fopen(“data.txt”,”r”); fread(buf,1,50,fp); /* process data */ fclose(fp); } 第二个线程,将数据附加到文件(=始终在前50个字节之后): while(1){ FILE* fp = fopen(“data.txt”,”a”); fwrite(“hello\n”,1,6,fp); fclose(fp); } 这个解决方案是线程安全且可移植的吗? (没有分段错误,没有数据不一致,……)