小编kin*_*er1的帖子

pThread同步问题有问题

我正面临着pthread的同步问题.threadWaitFunction1,是一个线程等待函数.我希望行没有.247 flag = 1只有在243-246完成后才能执行.但我觉得很奇怪,有时候,它会在243-246结束前直接跳到247.

请帮我.

提前致谢.

236   struct timespec timeToWait;
237   static void* threadWaitFunction1(void *timeToWaitPtr)
238   {
239       cout << "Setting flag =0 inside threadWaitFunction1\n";
240       
241       cout << "Inside threadWaitFunction\n";
242       struct timespec *ptr = (struct timespec*) timeToWaitPtr;
243       pthread_mutex_lock(&timerMutex);
          flag = 0;
244       pthread_cond_timedwait(&timerCond, &timerMutex, ptr);
          flag=1;
245       pthread_mutex_unlock(&timerMutex);
246       cout << "Setting flag =1 inside threadWaitFunction1\n";
247       
248
249    }
Run Code Online (Sandbox Code Playgroud)

创建并调用上述线程的线程是:

263  static void timer_trackStartTime ()
264  {
265       struct timeval now;
266       pthread_t thread;
267 …
Run Code Online (Sandbox Code Playgroud)

c linux pthreads

3
推荐指数
1
解决办法
1065
查看次数

系统调用包装器asm C.

有人可以向我解释这段代码吗?还请给我一些链接/ URL,我可以在这里了解更多信息?此代码用作包装器来覆盖库中的"extern int errno".有人可以解释我这个功能,并告诉为什么在一些系统调用中需要包装器?哪个也叫做WeakSYSCALLS?

#define ASM_ARGS_1      ASM_ARGS_0, "r" (_a1)
#define ASM_ARGS_2      ASM_ARGS_1, "r" (_a2)
#define ASM_ARGS_3      ASM_ARGS_2, "r" (_a3)
#define LOADREGS_5(a1, a2, a3, a4, a5)          \
register int _v1 asm ("v1") = (int) (a5);     \
LOADREGS_4 (a1, a2, a3, a4)

#define LOADREGS_6(a1, a2, a3, a4, a5, a6)      \

register int _v2 asm ("v2") = (int) (a6);     \

LOADREGS_5 (a1, a2, a3, a4, a5)

#define MYLIBC_SYSCALL(name, nargs, args...)               \
({                                                        \

    unsigned int retval;                              \

    {                                                 \

    register int _a1 asm …
Run Code Online (Sandbox Code Playgroud)

c assembly arm system-calls wrapper

2
推荐指数
1
解决办法
2164
查看次数

消息队列:msgsnd失败:参数无效

任何人都可以帮我指出我的程序中的错误是什么?

在此先感谢,kingsmasher1

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>

typedef struct msgbuf {
    long mtype;     /* message type, must be > 0 */
    char mtext[15];  /* message data */
} msgbuf;

int main() {
    key_t key;
    int msqid, pid, length;
    msgbuf buf;

    msqid=msgget(IPC_PRIVATE,IPC_CREAT);

    if(msqid==-1){
        perror("msgget failed");
        return;
    }
    else {
        printf("msgget succeeded. ID:%u",msqid);
    }

    pid=fork();

    if(pid==-1) {
        perror("fork failed\n");
    }

    buf.mtype=1;
    strcpy(buf.mtext, "This is a test message");
    length=sizeof(buf.mtext);

    if(msgsnd(msqid,&buf,length,0)!=0) {
        perror("msgsnd failed:\n");
    } …
Run Code Online (Sandbox Code Playgroud)

c linux message-queue

2
推荐指数
1
解决办法
1万
查看次数

sigaction - 为什么我们不必重置处理程序?

如果我们使用sigaction来定义信号处理程序,那么为什么我们不需要重置处理程序?如果我们使用,signal(sig_no,handler_func)那么我们必须重置它.为什么是这样?

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

void func(int sig)
{
 printf("caught signal:%d\n",sig);
 // Not needed to reset handler. Why? 
}

int main()
{
 struct sigaction sa;

 sa.sa_handler=(void*)func;
 sigaction(SIGRTMIN,&sa,NULL);
 kill(0,SIGRTMIN);
 kill(0,SIGRTMIN);
 kill(0,SIGRTMIN);
}
Output:
[root@dhcppc0 signals]# ./a.out
     caught signal:34
     caught signal:34
     caught signal:34 (3 times signal caught by same handler without resetting handler)
Run Code Online (Sandbox Code Playgroud)

c unix signals

2
推荐指数
2
解决办法
3459
查看次数

Ctrl + C:它​​是否也会与主进程一起杀死线程?

在运行线程程序并使用 反复杀死主程序时Ctrl + C,我在第二次运行时看到程序中出现意外结果。但是,如果我让程序运行并自愿退出,则没有问题。

所以,我的疑问是,是否Ctrl + C也与主进程一起杀死线程?

提前致谢。

c linux pthreads

2
推荐指数
1
解决办法
5060
查看次数

如何编写分段错误处理程序,以便不重启错误指令?(C和Linux)

我编写了一个分段错误处理程序,但问题是,发生错误的指令在转到处理程序后重新启动,这导致处理程序进入无限循环.

我希望处理程序工作,使得在到达处理程序之后,应该执行错误指令之后的指令,使得它不会进入无限循环.有人可以帮我一些代码片段吗?

我正在使用C和Linux.

c linux segmentation-fault

2
推荐指数
1
解决办法
2336
查看次数

是否有任何API或方法可以阻止对动态分配的内存进行读访问(和写入)?

是否有任何API或方法可以阻止对动态分配的内存进行读取访问?

char *ptr = malloc(4);`
strcpy(ptr, "Hello");`
Run Code Online (Sandbox Code Playgroud)

现在,我希望ptr没有读访问权限和写保护.怎么做到这一点?

我不希望使用,mprotect因为它会ptr指向映射内存,并且每次都可能无法放大动态内存.

c c++ linux memory-management

2
推荐指数
1
解决办法
160
查看次数

C:指针混乱

我明白这是基本的东西的一部分,但我被卡住了:-(有人可以帮帮我吗?

计划1:

#include <stdio.h>
#include <stdlib.h> 

int main()
{
 int a=1,b=2,c;
 c=(a+b)++;
}
Run Code Online (Sandbox Code Playgroud)

为什么输出错误?是否需要左值?

计划2:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
 char *p1="name";
 char *p2;

 p2=(char*)malloc(20);
 memset(p2,0,20);

 while(*p2++=*p1++);
 printf("%s\n",p2);

}
Run Code Online (Sandbox Code Playgroud)

为什么是输出,一个空字符串?如果我颠倒增量的顺序,那就是:while(++*p2=++*p1);为什么左值误差来了?

c pointers lvalue post-increment

1
推荐指数
1
解决办法
1218
查看次数

使用 dlopen 获取 libc 内存分配函数的句柄

有人可以帮助我了解如何使用 dlopen 来获取 libc 内存分配函数的句柄吗?特别是,像搜索 libc 路径然后获取句柄之类的东西。应该使用什么模式来调用 dlsym?

想法是:

  1. 搜索 libc 路径
  2. 对其调用 dlopen
  3. 使用 dlsym 访问内存函数(malloc、calloc 等)和
  4. 使用函数

请帮助我提供上述 4 个步骤的代码片段。

c linux memory-management dlopen

1
推荐指数
1
解决办法
4098
查看次数

我们可以重置sigsetjmp再次返回"0"(重置sigsetjmp)吗?

我使用sigsetjmp和siglongjmp编写了一个分段错误处理程序.一旦它进入信号处理程序,我调用siglongjmp,以便跳过错误的指令.

问题是,我再次想要导致SIGSEGV并转到相同的处理程序,但现在sigsetjmp将返回1.

如何重置sigsetjmp?

这是我的代码:

#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>
#include <setjmp.h>

sigjmp_buf env, env1;

void SIGSEGV_handler(int signal)
{
  printf("Segmentation fault caught\n");
  siglongjmp(env, 1);
}

int main()
{
 void * allocation;
 size_t size;
 static int devZerofd = -1;
 struct sigaction sa, sa1;

 sa.sa_handler=(void*)SIGSEGV_handler;
 sigaction(SIGSEGV, &sa, NULL);

 if ( devZerofd == -1 ) {
     devZerofd = open("/dev/zero", O_RDWR);
     if ( devZerofd < 0 )
         perror("open() on /dev/zero failed");
  }

 allocation = …
Run Code Online (Sandbox Code Playgroud)

c linux signals setjmp

1
推荐指数
1
解决办法
1386
查看次数