我编写了以下代码来创建内核线程:
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/kthread.h>
#include<linux/sched.h>
struct task_struct *task;
int data;
int ret;
int thread_function(void *data)
{
int var;
var = 10;
return var;
}
static int kernel_init(void)
{
data = 20;
printk(KERN_INFO"--------------------------------------------");
task = kthread_create(&thread_function,(void *)data,"pradeep");
task = kthread_run(&thread_function,(void *)data,"pradeep");
printk(KERN_INFO"Kernel Thread : %s\n",task->comm);
return 0;
}
static void kernel_exit(void)
{
ret = kthread_stop(task);
}
module_init(kernel_init);
module_exit(kernel_exit);
Run Code Online (Sandbox Code Playgroud)
在给出insmod命令后,我能够创建一个名为"pradeep"的内核线程,我可以使用以下ps -ef
命令查看新线程
,如下所示
root 6071 2 0 10:21 ? 00:00:00 [pradeep]
Run Code Online (Sandbox Code Playgroud)
并且它的父级是kthreadd,其PID是2.但是我无法在给出rmmod
命令时停止此线程.它提供以下输出:
ERROR: Removing 'pradeep': Device or resource …
Run Code Online (Sandbox Code Playgroud) 有人可以解释一下为什么内核不允许我们建立到目录的硬链接.是否因为它违反了文件系统的有向无环图结构的规则,或者是因为其他一些原因.如果它允许的话还有什么其他复杂情况?
我正在开发一个嵌入式系统,它使用buildroot作为构建内核和根文件系统的工具.我想对这个内核源代码树应用一些补丁,有人能告诉我buildroot如何应用补丁吗?
我有一个RDS实例,目前正在生产中,并且所有应用程序都使用相同的RDS实例.现在,当我想为每个应用程序创建单独的RDS实例时,我尝试使用称为恢复的RDS功能来指向时间点,但是创建新的RDS实例花了将近一个小时.
有人可以建议我执行它的一些好方法,以便我可以创建运行rds实例的精确副本.
我对共享库有一个重大疑问.我研究的是,不同进程共享的库的虚拟地址对于所有这些进程都是相同的.但是我尝试通过以下命令集使用proc文件系统来查看相同的内容:
$ cat /proc/*/maps | grep /lib/libc-2.12.1.so
Run Code Online (Sandbox Code Playgroud)
输出是:
0025a000-003b1000 r-xp 00000000 08:07 1046574 /lib/libc-2.12.1.so
003b1000-003b2000 ---p 00157000 08:07 1046574 /lib/libc-2.12.1.so
003b2000-003b4000 r--p 00157000 08:07 1046574 /lib/libc-2.12.1.so
003b4000-003b5000 rw-p 00159000 08:07 1046574 /lib/libc-2.12.1.so
0086d000-009c4000 r-xp 00000000 08:07 1046574 /lib/libc-2.12.1.so
009c4000-009c5000 ---p 00157000 08:07 1046574 /lib/libc-2.12.1.so
009c5000-009c7000 r--p 00157000 08:07 1046574 /lib/libc-2.12.1.so
009c7000-009c8000 rw-p 00159000 08:07 1046574 /lib/libc-2.12.1.so
00110000-00267000 r-xp 00000000 08:07 1046574 /lib/libc-2.12.1.so
00267000-00268000 ---p 00157000 08:07 1046574 /lib/libc-2.12.1.so
00268000-0026a000 r--p 00157000 08:07 1046574 /lib/libc-2.12.1.so
0026a000-0026b000 rw-p 00159000 08:07 1046574 /lib/libc-2.12.1.so …
Run Code Online (Sandbox Code Playgroud) 我使用POSIX pthread库编写了以下代码:
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
pthread_t pid1,pid2;
void *test(void *arg)
{
void **end;
printf("\nNew Thread ID: 0x%x\n",(unsigned int)pid2);
pthread_join(pid1,end);
printf("\nNew Thread going to go off\n");
printf("\nNew Thread ID: 0x%x\n",(unsigned int)pid2);
return ((void *)NULL);
}
int main()
{
pid1 = pthread_self();
pthread_create(&pid2,NULL,test,NULL);
printf("\nMain Thread ID: 0x%x\n",(unsigned int)pid1);
sleep(2);
printf("\nI am going off\n");
pthread_exit(0);
}
Run Code Online (Sandbox Code Playgroud)
在执行代码时,我得到以下输出:
Main Thread ID: 0xb7880b30 New Thread ID: 0xb787eb70 I am going off Segmentation fault
在我研究的时候,调用pthread_join的线程(pid2)将阻塞,直到在参数(pid1)中传递的线程调用pthread_exit().并且pthread_exit()用于停止执行特定线程,让所有其他线程继续执行.
我想知道为什么我最后会遇到Segmentation Fault.
请妥善解释一下.
我尝试将只读副本提升为单独的RDS实例.在此期间完成了将近10分钟.据我所知,它应该打破复制过程,同步时滞.但是我发现在EC2 RDS的情况下,db实例也会重新启动.有人可以清楚地向我解释整个过程.
我读到使用vfork()系统调用创建的新进程作为父地址空间中的线程执行,直到子线程不调用exit()或exec()系统调用,父进程被阻塞.所以我用vfork()系统调用编写了一个程序
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid;
printf("Parent\n");
pid = vfork();
if(pid==0)
{
printf("Child\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出如下:
Parent
Child
Parent
Child
Parent
Child
....
....
....
Run Code Online (Sandbox Code Playgroud)
我假设return语句必须在内部调用exit()系统调用,所以我只期望输出
Parent
Child
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么实际上它不会停止并持续打印无限循环.
我遇到了以下程序
class Boolean {
public static void main(String argv[]) {
boolean x;
x = 4.4f == 4.4;
System.out.println(x);
}
}
Run Code Online (Sandbox Code Playgroud)
以下程序的输出是 false
但是,如果我们以下列方式编写程序,那么
class Boolean {
public static void main(String argv[]) {
boolean x;
x = 4.5f == 4.5;
System.out.println(x);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下输出是 true
有人可以解释一下为什么吗?
我有关于Linux内存的以下问题:
我知道活动内存是最常访问的内存部分.但有人可以解释一下linux如何将内存位置用于活动内存或非活动内存.
所有组件的活动内存包含哪些内容?磁盘/文件缓存是否被视为活动内存的一部分.
Buffers
和Cached
记忆有什么区别?