小编Lip*_*eka的帖子

多个线程之一的 Pthread_join

我的问题类似于如何在使用 pthread 时检查线程是否终止?。但我没有完全得到答案。

我的问题是......我创建了一定数量的线程,比如n。一旦 main 检测到任何一个线程的退出,它就会创建另一个线程,从而保持并发度为 n 等等。

主线程如何检测线程的退出。pthread_join 等待特定线程退出,但在我的例子中,它可以是 n 个线程中的任何一个。

谢谢

c linux pthreads

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

包含 unistd.h 的 write() 包装例程会导致错误

我正在编写一个包装例程来write()覆盖原始系统函数,并且在其中我需要通过执行另一个程序execve();我为其添加了头文件unistd.h。我得到了错误conflicting types for 'write' /usr/include/unistd.h:363:16: note: previous declaration of 'write'was here。如果有人可以帮助我,我将非常感激,因为我需要从包装器内部调用另一个程序,并从包装器例程内部向它发送参数。

c linux wrapper

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

SIGSTOP和SIGCONT等效于线程

对于线程,是否有类似于SIGSTOP和SICONT的东西?我正在使用pthreads.谢谢

编辑:我正在实现线程之间文件访问同步的粗略形式.因此,如果一个文件已经被一个线程打开,而另一个线程想再次打开它,我需要暂停或暂停第二个线程的执行.当第一个线程完成其工作时,它将检查其他线程想要使用它发布的文件并"唤醒"它们.然后第二个线程从那个点恢复执行.我用自己的书保存数据结构.

c linux signals pthreads

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

Valgrind显示以下内存泄漏有多严重

在编写了数千行代码之后,我使用了valgrind并且惊恐地看到了错误的数量.之前只是使用GDB.我的大多数错误都是使用字符串函数.我张贴了一部分.我理解错误正在发生,因为strlen不计算尾随的NULL,而strcpy添加它.有多严重?我真的需要修理它们吗?我可以解决它,但担心如果这可能会导致更多的错误,因为我的代码并没有记住,当我作为wriitng时.

即使没有为它保留空间,strcpy是否复制尾随的NULL?

t.write_length = (strlen("NA\n");/*Line number 116*/
t.data = malloc(strlen("NA\n");/*117*/
strcpy(t.data,"NA\n");/*118*/
Run Code Online (Sandbox Code Playgroud)

Valgrind的:

==3287== Invalid write of size 1
==3287==    at 0x400764E: memcpy (mc_replace_strmem.c:497)
==3287==    by 0x804A714: log_txn_commit (Log_manager.c:118)
==3287==    by 0x8049D3C: on_txn_commit (TxFS_manager.c:85)
==3287==    by 0x804939E: handler (Reader.c:139)
==3287==    by 0xBF5F18: start_thread (in /lib/libpthread-2.12.90.so)
==3287==    by 0xB37A2D: clone (in /lib/libc-2.12.90.so)
==3287==  Address 0x403282b is 0 bytes after a block of size 3 alloc'd
==3287==    at 0x4005BDC: malloc (vg_replace_malloc.c:195)
==3287==    by 0x804A6F5: log_txn_commit (Log_manager.c:117)
==3287==    by 0x8049D3C: on_txn_commit (TxFS_manager.c:85)
==3287==    by …
Run Code Online (Sandbox Code Playgroud)

c linux valgrind

4
推荐指数
3
解决办法
548
查看次数

链接pthread库问题

面对一个可能稍微复杂的问题,解释和理解,因为给出整个画面会太大而且困难.

请原谅我.

考虑以下Makefile:

all: clients.so simulator backup
    LD_PRELOAD=/home/Juggler/client/clients.so ./simulator

backup: backup.c libclient.a
    gcc backup.c -o backup -L /home/Juggler/client -L. -lclient -ldl
simulator: simulator.c libclient.a
    gcc -g simulator.c -o simulator -L /home/Juggler/client -L. -lclient -ldl -pthread
libclient.a: libclient.o client.o
    ar rcs libclient.a libclient.o client.o
libclient.o:libclient.c  
    gcc -c libclient.c -o libclient.o -pthread

clients.so: client.o client_invoke.o
    ld -shared -o clients.so client_invoke.o client.o -ldl
client_invoke.o: client_invoke.c
    gcc -Wall -fPIC -DPIC -c -g client_invoke.c
client.o: client.c
    gcc -Wall -fPIC -DPIC -c -g client.c -ldl -pthread …
Run Code Online (Sandbox Code Playgroud)

c linux makefile pthreads undefined-reference

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

name_to_handle_at()的逻辑

我没有获得有关新系统调用 name_to_handle_at() 和 open_to_handle_at() 的太多信息。有人可以帮我从这里出去吗。

谢谢

编辑。我只有这个

http://comments.gmane.org/gmane.linux.man/2158

c linux system-calls

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

覆盖随机访问文件

我有一个以"r + b"模式打开的随机访问文件,其长度相等.我可以在阅读并改写记录后更改记录的内容吗?

我尝试了以下代码,但在运行时我得到:分段错误(核心转储)

#include<stdio.h>

int main()
{
   struct tala {
      int rec_no;
      long file_no;
   };
   FILE *file_locking;
   struct tala t,f;
   file_locking = fopen("/path/to/my/file.bin", "rb+");
   t.rec_no = 1;
   t.file_no = 3;
   if (fwrite(&t, sizeof(struct tala),1,file_locking)==0)
      printf("Error opening file");
   t.rec_no=0;
   rewind(file_locking);
   if (fwrite(&t, sizeof(struct tala),1,file_locking)==0)
      printf("Error opening file");
   rewind(file_locking);
   if (fread(&f, sizeof(struct tala),1,file_locking)==0)
      printf("Error opening file");
   printf("\n %d",f.rec_no);
   printf("\n %ld", f.file_no);
   fclose(file_locking);
}
Run Code Online (Sandbox Code Playgroud)

c linux file

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

Readdir/closedir - Valgrind 显示“无效读取”

在此处发布我的代码片段。我正试图在调试中立足。

struct dirent *s_dirent;
char path[300];
....
bzero(path,300);
...
fd_dir = opendir(path);
while((s_dirent = readdir(fd_dir))!=NULL)
{
     if(s_dirent->d_name[0] == '.')
          continue;
     else
          break;
 }
if(s_dirent == NULL)
{
   if(closedir(fd_dir)!=0)
       perror("Error on closedir");
 }
else
{

  if(closedir(fd_dir)!=0)/*Line number 249*/
      perror("Error on closedir");

  /*some comments*/
  strcat(path,"/");
  strcat(path,s_dirent->d_name);/*Line number 254*/
 }
Run Code Online (Sandbox Code Playgroud)

Valgrind 输出:

==3287== Invalid read of size 1
==3287==    at 0x40069E0: strcat (mc_replace_strmem.c:176)
==3287==    by 0x804D6B4: online_bck (backup_manager.c:254)
==3287==    by 0x8049F96: on_bck_beg (TxFS_manager.c:181)
==3287==    by 0x8049818: handler (Reader.c:236)
==3287==    by 0xBF5F18: start_thread (in …
Run Code Online (Sandbox Code Playgroud)

c linux valgrind readdir

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

有向图中的循环

想知道我们是否可以证明以下内容,或者是否已经证明我可以在哪里获得证据.

令v1,v2,v3 ... vn和t为有向图中的n + 1个顶点.v1,v2,v3 ... vn形式有向无环图.t连接到v1,v2,v3 ... vn的每个人.现在由于v1,v2,v3 ... v4以非循环方式连接,如果有一个循环,那么它将涉及t.我们是否可以证明长度超过3的所有循环总是涉及长度为3的循环.记住t连接到每个v1,v2 ... vn并且没有成对循环.

进一步解释问题.

假设顶点v1,v2,v3..vn的非循环有向图是v1-> v2-> v3 - > ... vn.每个v都有一个t的边.假设有一个周期t-> v1-> v2-> v3-> t.这样的循环似乎肯定涉及长度为3的循环,其为t-> v1-> v2-> t或t-> v2-> v3-> t.但是无法证明这一点.

谢谢

algorithm graph graph-algorithm

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

拦截stat()

我已经successfuly截获通话read(),write(),open(),unlink(),rename(),creat()但不知何故,与同样的语义拦截stat()未发生.我已使用LD_PRELOAD更改了执行环境.

我错过了什么吗?

代码非常庞大,哪部分内容最有帮助,所以你可以提供帮助?

谢谢.

编辑:我保持插入的stat()包装器简单,以检查它是否工作.

int stat(const char *path,struct stat *buff)
{
    printf("client invoke: stat %s",path);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

c linux stat

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