小编use*_*152的帖子

POSIX pthread编程

我必须编写一个多线程(比如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)

c posix pthreads

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

使用OpenSSL EVP_DigestSign*生成CMAC密钥失败

我正在尝试生成使用OpenSSL计算CMAC的密钥.

但是,这些似乎失败了,下面复制了错误消息.有人能指出问题所在吗?有人EVP_DigestSign*打电话给CMAC 吗?

以下是代码的一部分,该代码是通过https://wiki.openssl.org/index.php/EVP_Key_and_Parameter_Generation中的示例构建的:

BIO *out = NULL;   
out = BIO_new(BIO_s_file());

if (out == NULL)
        return -1;
BIO_set_fp(out, stdout, BIO_NOCLOSE);

EVP_MD_CTX* rctx = NULL;
EVP_PKEY *pkey = NULL;
EVP_PKEY_CTX *kctx = NULL;

rctx = EVP_MD_CTX_create();
if(rctx == NULL) {
    printf("EVP_MD_CTX_create failed\n");
}
 if(!EVP_PKEY_keygen_init(kctx)){
     printf("EVP_PKEY_keygen_init failed\n");
}

if (EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,EVP_PKEY_CTRL_CIPHER,0, (void *)EVP_aes_256_ecb()) <= 0)
    printf("EVP_PKEY_CTX_ctrl 1  failed\n");

if (EVP_PKEY_CTX_ctrl(kctx, -1, EVP_PKEY_OP_KEYGEN,EVP_PKEY_CTRL_SET_MAC_KEY,/*key length*/32, "01234567890123456789012345678901") <= 0)
    printf("Set the key data failed 1\n");
Run Code Online (Sandbox Code Playgroud)

这里的错误:

EVP_PKEY_CTX_ctrl failed
3073898120:error:06093096:lib(6):func(147):reason(150):pmeth_gn.c:122:
3073898120:error:06089093:lib(6):func(137):reason(147):pmeth_lib.c:390: …
Run Code Online (Sandbox Code Playgroud)

openssl cmac

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

Android .SF文件

我想知道MANIFEST.MF文件和Android上下文中的.SF文件之间有什么区别.

我可以看到,MANIFEST.MF文件包含Android .apk的每个源文件的sha1摘要.

但是.SF还列出了所有源并计算SHA1摘要.这个摘要值计算的是什么?

有任何想法吗?

另外如何查看.RSA(签名块文件)?

提前致谢

java android-manifest

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

内存Clobbering错误

我有一小段代码.我编译它时-lmcheck,我正在尝试调试代码,我有相同的类似错误.

运行此代码时出现此错误:

memory clobbered before allocated block
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么free(ptr)会把这个错误抛给我?

我怎么能释放指针?

谢谢.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#define LEN 5


int main(int argc, char *argv[]){

    char *ptr = NULL;

    ptr = (char *) malloc(LEN+1);// +1 for string
    strcpy(ptr, "hello");

    int i = 0;
    for(i = 0; i<LEN; i++)
    {
        printf("ptr[%d] = %c\n", i, ptr[i]);
        ptr++;
    }
    free(ptr);


    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c malloc memory-leaks

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

RSA签名是否独一无二?

我想知道RSA签名是否对数据是唯一的.

假设我有一个"你好"的字符串.计算RSA签名的方法首先是获取sha1摘要(我知道这些数据是unqiue),然后添加一个带有OID和填充方案的报头,并做一些数学微动来给出签名.

现在假设填充相同,openSSL或Bouncy Castle生成的签名是否相同?

如果是的话,我唯一担心的是,获取"文本"/数据会不容易?

我试图对一些数据进行RSA签名,而OpenSSL和BC的签名则不同.我重复了一遍,但他们每个人都一次又一次地签名.我意识到由于填充的不同,这两种方法的签名是不同的.但是我仍然不确定为什么每次重复它们时,每个库的签名都是相同的.有人可以给一个简单的解释吗?

cryptography rsa sign

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

如何在JSF中创建切换按钮?

如何在JSF中创建切换按钮?

基本上,我需要两个按钮“ in”和“ out”。它们本质上调用了相同的托管Bean,但是由于每次单击,都应禁用一个,而应启用另一个,反之亦然。如何才能做到这一点?我应该使用ajax功能吗?

jsf toggle jsf-2 commandbutton

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

TrustZone 与虚拟机管理程序

我刚刚在TrustZone上阅读ARM 的这份文档,有些事情我不清楚。

事实上,Hypervisor提供了一种特殊的 CPU 模式,并且对于TrustZone来说,处理器附带了一个额外的第 33 位:模式不是也是一个特定的位设置吗?那么,额外的一点是如何在安全性方面产生如此大的差异的呢?我确实知道额外的位可以为两个单独的 32 位地址空间让路,但除此之外,我无法将两个和两个放在一起。有人可以清楚地解释为什么TrustZone比 Hypervisor 更安全吗?

security arm hypervisor trustzone

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

使用多个线程调试C程序

我想调试运行多个TCP服务器线程的C程序.我无法设置复杂的调试工具,因为我必须在嵌入式Linux(忙箱)中进行调试.我希望它原生支持gdb.

所以我开始使用gdb.一旦我键入运行,服务器似乎在后台运行,但gdb返回提示和"程序接收信号SIG64(实时事件64)"消息(与猜测相关的pthread).我知道它必须与主要分叉到几个线程.但我不知道如何调试这个.任何起点都会非常有帮助.

另外,还有其他一些"跟踪"类似调试器,我可以使用小占用空间吗?

请帮忙

c debugging gdb

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

确保TCP客户端和服务器之间没有丢包

我正在编写一个Java TCP客户端,它将数据块发送到C服务器.客户端 - 服务器在我的开发PC上运行良好.在硬件板上部署时,此代码显示数据包丢失.我只有我的日志,我知道服务器没有收到所有数据包.我没有要测试的硬件.因此,在第一级,我想非常确定客户端代码确实发送了所有必需的数据.

这是我的代码(Java中的客户端部分).我如何确保这样做?是否有一些重定时命令等命令?

        Socket mySocket = new Socket("10.0.0.2",2800);
        OutputStream os = mySocket.getOutputStream();         

        System.out.println(" Sending 8 byte Header Msg with length of following data to Server");
        os.write(hdr, 0, 8);  
        os.flush();

        System.out.println(" Sending Data ");
        start = 0;
        for(int index=0; index < ((rbuffer.length/chucksize)+1); index++){             
            if(start + chucksize > rbuffer.length) {
                System.arraycopy(rbuffer, start, val, 0, rbuffer.length - start);
            } else {
                System.arraycopy(rbuffer, start, val, 0, chucksize);
            }
            start += chucksize ;

            os.write(val,0,chucksize);  
            os.flush();
        }
Run Code Online (Sandbox Code Playgroud)

以下是接收此数据的C片段:

while ((bytes_received = recv(connected, rMsg, sizeof(rMsg),0)) …
Run Code Online (Sandbox Code Playgroud)

c java packets tcpclient

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

将大缓冲区复制到较小缓冲区的块中

我有一个已知大小的巨大缓冲区。我需要复制它的块以通过套接字发送到服务器。为此,我试图一次复制 1024 个字节,然后发送它。

这里的问题是,我不知道缓冲区的内容。它可以是字符串或二进制。它应该处理缓冲区中包含的所有数据。

这是我编写的代码,当然不起作用。这只是一个小的测试代码,我首先使用一个字符串。后来我想用一些二进制文件等来测试它。但首先我必须正确地理解指针概念!

int main(int argc, char *argv[]){

    char hexstr [] = { 0x02, 0x01, 0x03, 0x04, 0x05, 0x06};
    //trying with a string
    char Bbuf [20]= "Hihelloohowareyou?";
    FillBuffer( Bbuf,sizeof(Bbuf));

        return 0;
}


int FillBuffer(char *bigbuf, int len){

    char smallbuf[4];
    int i = 0;
    int buflen= sizeof(smallbuf);
    printf("length of smallbuf is= %d\n",buflen);
    printf("length of original string= %d\n", len);
    for( i=buflen; i< len+buflen;i =i+buflen){
        memcpy(smallbuf,bigbuf,i);
        printf("i== %d\n", i);
        bigbuf= bigbuf+i;
        //printf("smallbuf conatins= %s\n", smallbuf);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢

c pointers

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

如何从Linux内核进行标准库调用?

我正在调整驻留在/netlinux内核目录中的代码.

我努力之类的东西打印,但我看到,有没有相关的报头(如stdlib.h,stdio.h等).那么如何在内核级别执行此操作呢?

c linux kernel

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

C套接字服务器,Java套接字客户端:阻塞!

我在C和Java客户端粘贴我的代码用于简单的套接字服务器.

我在Java中使用逐字符发送的write方法.但是,在发送了一大块字符(此处为'h','e','y')之后,由于C服务器没有回复它,Java客户端被阻止发送:(

我假设发送一个空字符(来自Java写)会阻止C侧的recv有一些问题.

任何帮助将不胜感激.

C服务器:

#include <stdio.h>   /* standard in and output*/
#include <sys/socket.h> /* for socket() and socket functions*/
#include <arpa/inet.h>  /* for sockaddr_in and inet_ntoa() */
#include <stdlib.h>    
#include <string.h>     
#include <unistd.h>     /* for close() */


int main(int argc, char *argv[]){
 int sock, connected, bytes_received, true = 1;  
    char recv_data;      
 char replyBuffer[32];

    struct sockaddr_in server_addr,client_addr;    
    int sin_size;       
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("Socket");
        exit(1);
    }

    if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) {
        perror("Setsockopt");
        exit(1);
    }

    server_addr.sin_family …
Run Code Online (Sandbox Code Playgroud)

c java

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