我的问题类似于如何在使用 pthread 时检查线程是否终止?。但我没有完全得到答案。
我的问题是......我创建了一定数量的线程,比如n。一旦 main 检测到任何一个线程的退出,它就会创建另一个线程,从而保持并发度为 n 等等。
主线程如何检测线程的退出。pthread_join 等待特定线程退出,但在我的例子中,它可以是 n 个线程中的任何一个。
谢谢
我正在编写一个包装例程来write()覆盖原始系统函数,并且在其中我需要通过执行另一个程序execve();我为其添加了头文件unistd.h。我得到了错误conflicting types for 'write' /usr/include/unistd.h:363:16: note: previous declaration of 'write'was here。如果有人可以帮助我,我将非常感激,因为我需要从包装器内部调用另一个程序,并从包装器例程内部向它发送参数。
对于线程,是否有类似于SIGSTOP和SICONT的东西?我正在使用pthreads.谢谢
编辑:我正在实现线程之间文件访问同步的粗略形式.因此,如果一个文件已经被一个线程打开,而另一个线程想再次打开它,我需要暂停或暂停第二个线程的执行.当第一个线程完成其工作时,它将检查其他线程想要使用它发布的文件并"唤醒"它们.然后第二个线程从那个点恢复执行.我用自己的书保存数据结构.
在编写了数千行代码之后,我使用了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) 面对一个可能稍微复杂的问题,解释和理解,因为给出整个画面会太大而且困难.
请原谅我.
考虑以下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) 我没有获得有关新系统调用 name_to_handle_at() 和 open_to_handle_at() 的太多信息。有人可以帮我从这里出去吗。
谢谢
编辑。我只有这个
我有一个以"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) 在此处发布我的代码片段。我正试图在调试中立足。
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) 想知道我们是否可以证明以下内容,或者是否已经证明我可以在哪里获得证据.
令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.但是无法证明这一点.
谢谢
我已经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)