小编Don*_*ild的帖子

fork()在内部调用clone()是真的吗?

我读到这里clone()系统调用,用于在Linux中创建一个线程.现在,语法clone()是这样的,就需要启动程序/函数地址传递给它.

但是在这个页面上写的内部fork()调用clone().所以我的问题是如何通过fork()开始运行fork()调用后的代码部分来创建子进程,即它如何不需要函数作为起点?

如果我提供的链接信息不正确,请指导我一些更好的链接/资源.

谢谢

c linux operating-system system-calls

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

如何将多个信任库路径添加到"java.net.ssl.trustStore"?

我希望我的Java代码在一个密钥库中搜索服务器的CA证书...如果它无法找到特定的证书(我认为只有当我尝试通过LDAP连接到Directory Server时才会知道),它应该是在另一个密钥库中查找证书,我知道它的路径.

我试过这个:

System.setProperty("javax.net.ssl.trustStore", System.getProperty("java.home") + "/lib/security/cacerts" + System.getProperty("path.separator") + path/to/second/keystore);

但它似乎没有用.

只添加一个路径(其中任何一个)都可以工作,即如果找到证书则会像魅力一样运行,否则就会失败.

所以我的问题是:

  1. 是否有方法将多堆密钥库路径添加到javax.net.ssl.trustStore?

  2. 如果不可能我应该如何编写我的代码(我要求算法),以便它在第一次搜索后不会抛出异常而失败?

PS:我对Java不太熟悉.

以下是我的代码的相关部分:

if(useSSL)
{
  try 
  {   
    SSLContext se = SSLContext.getInstance("TLS");
    Security.addProvider(se.getProvider());
  }   
  catch(NoSuchAlgorithmException e) { }

  System.setProperty("javax.net.ssl.trustStore", System.getProperty("java.home") + "/lib/security/cacerts");

  com.org.ldap.LDAPSocketFactory ssf = new LDAPJSSESecureSocketFactory();
  LDAPConnection.setSocketFactory(ssf);
}

try 
{   
  lc = new LDAPConnection();
  lc.connect( ldapServer, ldapPort);
  lc.bind( ldapVersion,  ldapUser, (userInfo[1]).getBytes() );
}
catch (LDAPException le)
{
  le.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

java ssl certificate

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

只有一个元素的结构有什么用?

例:

struct dummy 
{
    int var;
};
Run Code Online (Sandbox Code Playgroud)

为什么使用这样的结构?大多数情况下,我在一些头文件中看到过它们.

atomic_t类型也被定义这样的.不能简单地定义使用:

typedef int atomic_t;
Run Code Online (Sandbox Code Playgroud)

c variables struct

11
推荐指数
4
解决办法
1727
查看次数

为什么pthread_mutexattr_settype()处于POSIX/IEEE标准时需要_GNU_SOURCE宏?

我用C 编写了一个多线程服务器程序,它回显客户端发送的所有数据.

最初,我poll()在我的程序中使用函数来检测POLLRDHUP事件,为此我定义了_GNU_SOURCE宏(这里定义此事件).

后来我更新了我的代码和删除的poll()功能,但我忘了删除_GNU_SOURCE宏.

现在我的代码终于完成了(有点长,发布超过250行).在删除宏之前,我正在编译我的程序:

gcc multi_thread_socket_v4.c -Wall -Werror -g -lpthread -o multi_thread_socket
Run Code Online (Sandbox Code Playgroud)

它工作正常:没有错误,没有警告

删除宏定义并使用相同的命令行编译后,gcc的输出为:

multi_thread_socket_v4.c: In function ‘main’:
multi_thread_socket_v4.c:194: warning: implicit declaration of function ‘pthread_mutexattr_settype’
multi_thread_socket_v4.c:194: error: ‘PTHREAD_MUTEX_ERRORCHECK’ undeclared (first use in this function)
multi_thread_socket_v4.c:194: error: (Each undeclared identifier is reported only once
multi_thread_socket_v4.c:194: error: for each function it appears in.)
Run Code Online (Sandbox Code Playgroud)

我已经包含了所有必需的库,因为它最初工作正常.

我偷看成pthread.h/usr/include/pthread.h,发现了这一点:

/* Mutex types. …
Run Code Online (Sandbox Code Playgroud)

c multithreading language-features gcc client-server

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

假设errno总是积极的是否安全?

我正在编写一个程序,其中大多数使用过的库函数在出错时返回-1并设置errno.程序的行为是这样的,如果发生错误它将退出.要确定确切的退出点和程序外部的错误(使用示例gdb),我想使用以下方法:

err = func_1(..arglist_1..);
if(err != 0)
{
    perror("func(..arglist..)");
    return ((1u << 8) | errno);
}
//..
//.. some more funcs
//..
err = func_n(..arglist_n..);
if(err != 0)
{
    perror("func(..arglist_n..)");
    return (((unsigned)n << 8) | errno);
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是安全的假设.

现实: 错误号被声明为extern int errno;内部errno.h
假设1:价值错误号总是小于255
假设2: 错误号总是正的.

根据定义的所有误差常数(EAGAIN等)errno.h,这些假设目前都是正确的.这些可以假设在未来也是如此吗?

PS:我不想依赖于perror()确定退出点.

c x86-64 suse errno

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

为什么在poll()函数中使用POLLRDHUP事件标志之前需要定义_GNU_SOURCE宏?

poll()在我的程序中使用函数,我读了这个链接,使用POLLRDHUP标志你必须_GNU_SOURCE在所有头文件包含之前定义.我需要这个标志,以便轮询套接字可以告诉我客户端是否挂起,以便我可以终止相应的线程.

顺便说一句,我正在编写一个可以同时处理多个客户端的'echo'服务器的C程序,我在OpenSuse Linux Enterprise Server 10.3(x86_64)上使用GCC 4.1.2.

c sockets opensuse

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

如果将int(*p_arr)[10]定义为指向大小为10的数组的指针,那么为什么编译器会在这种情况下显示警告?

我有这个代码:

#include <stdio.h>

int main()
{
    int arr[10] = {0};
    int *p1_arr = arr;
    int (*p2_arr)[10] = arr;      // Line 7, Shows Warning here

    ...

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

在编译gcc使用时gcc -g -Wall LengthofArray.c,它显示以下警告:

gcc: LengthOfArray.c:7: [Warning] assignment from incompatible 
                         pointer type [enabled by default]
Run Code Online (Sandbox Code Playgroud)

我的问题是if int (*p2_arr)[10]是一个指向大小为10的数组的指针,那么为什么编译器显示这个警告?

那么正确的方法是什么呢?

我在Windows 7 32位(DevC++)上使用了gcc 4.7.2,
并在SLES 10.3 x86_64上检查了gcc 4.1.2

c arrays gcc pointer-to-array

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

如何在Linux用户空间中实现高度精确的计时器?

我的BeagleBoard上装有Angstrom Linux。

我想实现一个非常精确的计时器,它可以每500us触发一次。我读到有关hrtimers,但发现的所有实现都是针对内核空间的。我想在用户空间中实现它。

有没有可以调用这些API的API hrtimers,我可以在用户空间中使用它,或者以其他方式在Linux中实现准确的计时器?

我已将其设置jiffy为几纳秒。

linux timer beagleboard

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

关于makefile如何工作的说明?

我发现一个makefile 这里一边念叨自动工具.

我从来没有使用像这样的makefile,我自己尝试过.
我写的makefile的内容是:

all: HelloWorld

clean:
    rm -f HelloWorld *.o
Run Code Online (Sandbox Code Playgroud)

包含makefile的文件夹只包含一个文件HelloWorld.c.

make以下输出成功运行:

$> make
cc     HelloWorld.c   -o HelloWorld
Run Code Online (Sandbox Code Playgroud)

现在,我想尝试,并在makefile我改名为目标allHelloWorl.这次make失败并出现以下错误:

$> make
make: *** No rule to make target `HelloWorl', needed by `all'.  Stop.
Run Code Online (Sandbox Code Playgroud)

请解释make自动搜索和编译源的这种行为.

我的理解是它通过附加.c并使用默认cc编译器编译来从目标名称创建源名称.

c makefile autotools

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

在这种情况下char str [1]和char*str之间的区别?

在研究一些代码时,我遇到了以下结构:

/* PACKET format:
 * 
 *     clientRandom  - 20 byte buffer
 *     yLen          - 4 bytes (LoHi integer)
 *     yData         - yLen byte buffer
 *
 *   Total length = 24 + yLen bytes
*/
typedef struct packetFormat
{
    char clientRandom[20];
    uint32 yLen;
    char yData[1];
}packetFormat;
Run Code Online (Sandbox Code Playgroud)

为什么第三个字段没有声明为char *yData可变长度的char缓冲区?

c arrays struct

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

为什么函数定义中的函数参数不强制提及`int`数据类型?

最近我经历了一些类似的代码:(代码是专有的,因此添加了类似的代码)

#include<stdio.h>

void test_it(var)
{
    printf("%d\n",var);
}

int main()
{
    test_it(67);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

test_it没有提到数据类型的参数.

我编译为gcc test_it.c......:令人惊讶的没有警告/错误

我再次编译使用:gcc -Wall test_it.c...:再次没有警告/错误

(现在变得更具侵略性......)

我使用以下方法再次编译它:gcc -Wall -Wextra test_it.c...:
warning: type of ‘var’ defaults to ‘int’最后我得到了警告.

我尝试使用多个参数:

void test_it(var1, var2)
{
    printf("%d\n%d\n",var1, var2);
}

int main()
{
    test_it(67,76);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

同样的行为!!

我也试过这个:

void test_it(var)
{
    printf("%d\n",var);
}

main()   // Notice that no `int` there
{
    test_it(67);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码-Wall仅提供选项警告.

所以我的问题是为什么 …

c gcc compiler-warnings

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

gcc的正确选项顺序是什么?该序列的重要性是什么?

我用这个命令来编译我的程序:

gcc -g -Wall -Werror -lpthread multi_thread_server.c -o multi_thread_socket_v4

它给出了undefined reference to <function_name>错误.

经过大量的试验和错误修复错误后,我(错误地)将选项重新排列gcc为:

gcc multi_thread_server.c -lpthread -Wall -Werror -o multi_thread_server -g

它起作用了.

在SO读到这个问题,我明白了为什么会这样.

在这里,我想知道,是否有用于选项序列的规则gcc

PS:我知道有无限的选择gcc,我想知道根据选项类别的顺序.

c gcc

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

"pid = fork();"怎么样?在子进程中分配"pid = 0"?

我在读Beej的fork()底漆,当我打电话pid = fork();,父进程得到子进程的PID,而孩子的过程中pid = 0.

现在,因为子进程开始执行代码的一部分fork()声明,请问pid获得价值0

c linux operating-system fork pid

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