小编Vin*_*Vin的帖子

在虚拟内存中,两个不同的进程可以具有相同的地址吗?

这是我在一个网站上发现的一个面试问题,问题是:"在虚拟内存中,两个不同的进程可以有相同的地址吗?当你回答"否"这是正确的时,一个进程如何访问另一个进程的内存,例如,调试器可以访问变量并在调试时更改它们吗?"

我的理解是:

  1. 2 diff进程可以具有相同的虚拟内存地址.这是因为每个进程都有自己的页表.每个进程都认为它是32位机器上的4Gb内存.因此P1和P2都可以访问地址0xabcdef - 但物理内存位置可能不同.这不对吗?

  2. 调试器的工作原理相同 - 2个进程可以访问同一个地址.所以它可以动态修改变量等.

operating-system

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

使用waitpid还是sigaction?

我已经理解:1)waitpid用于等待孩子的死亡,然后收集SIGCHLD和孩子的退出状态等.2)当我们有一个SIGCHLD的信号处理程序时,我们做了一些与清理相关的事情.孩子或其他东西(由程序员决定)然后做一个waitpid,这样孩子就不会去僵尸然后回来.

现在,当我们执行fork/exec并且子进程返回时,我们是否需要在程序中同时使用1和2?如果我们两者都有,则首先获取SIGCHLD,因此首先调用信号处理程序,因此成功调用其waitpid而不是父进程代码中的waitpid,如下所示:

my_signal_handler_for_sigchld
{
do something
tmp = waitpid(-1,NULL,0);
print tmp (which is the correct value of the child pid)
}

int main ()
{
  sigaction(SIGCHLD, my_signal_handler_for_sigchld)
  fork()
  if (child) //do something, return
  if parent // waitpid(child_pid, NULL,0); print value returned from this waitpid - it is -1
}
Run Code Online (Sandbox Code Playgroud)

感谢有人帮助我理解这一点.

c linux operating-system

7
推荐指数
2
解决办法
5189
查看次数

运行服务器进程时,动态获取C中未使用的端口号

我正在使用C并编写客户端 - 服务器程序,我想获得一个未使用的端口号来运行我的服务器进程.我的服务器代码是这样的:

getaddrinfo()
socket()
bind()
listen
while(1)
  accept()
Run Code Online (Sandbox Code Playgroud)

我需要为bind()调用提供未使用的端口addr.但是我不希望在启动服务器进程时通过命令行传递端口号.端口号应该通过套接字调用获得,我需要使用它来启动我的客户端进程.是否有任何套接字调用可以帮助我在C中动态获取未使用的端口?

c sockets linux

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

以编程方式获取 docker stats

我正在使用 docker-py 并尝试获取 docker stats。但是我无法获得任何 API 来返回特定容器的统计信息。是否有 REST API 或任何其他方式以编程方式获取统计信息?

>>> cli = docker.Client(base_url="tcp://xxxxx:2375", version='1.21')
>>> cli.containers() >> gives the right o/p
>>> cli.containers.get()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'get'

>>> docker.version
'1.10.6'
Run Code Online (Sandbox Code Playgroud)

python docker

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

在C中使用#define定义路径

我想定义一个这样的路径:

#define PATH /abc/xyz/lmn
Run Code Online (Sandbox Code Playgroud)

该PATH是具有文件foo1,foo2,foo3,... foo115的目录.

如何在"打开"调用中使用此#define打开foo1,foo2,... foo115?

我想基本上使用指令执行此操作:

fd = open("/abc/xyz/lmn/foo1", O_RDONLY);
Run Code Online (Sandbox Code Playgroud)

c linux c-preprocessor

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

在C中使用char指针时strcpy

我对char数组有一个简单的疑问.我有一个结构:

struct abc {
char *charptr;
int a;
}

void func1()
{
    func2("hello");
}

void func (char *name)
{
    strcpy(abc.charptr, name); >>> This is wrong. 
}
Run Code Online (Sandbox Code Playgroud)

这个strcpy会导致崩溃,因为我没有为charptr分配任何内存.问题是:为了记录这个记忆,我们可以做

abc.charptr = (char *) malloc(strlen(name)); ?
strcpy(abc,charptr, name); >>> Is this (or strncpy) right ?
Run Code Online (Sandbox Code Playgroud)

这是正确的吗 ?

c string char

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

在Python3中查找字符串中所有出现的单词

我试图在1个句子中找到包含"地狱"的所有单词.下面的字符串中有3次出现.但是re.search只返回前两次出现.我试过findall和搜索.有人可以告诉我这里有什么问题吗?

>>> s = 'heller pond hell hellyi'
>>> m = re.findall('(hell)\S*', s)
>>> m.group(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'group'
>>> m = re.search('(hell)\S*', s)
>>> m.group(0)
'heller'
>>> m.group(1)
'hell'
>>> m.group(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: no such group
>>> 
Run Code Online (Sandbox Code Playgroud)

python regex python-3.x

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

getaddrinfo 中返回的 sin_port 错误

我正在编写一个服务器客户端程序,在服务器中我使用 getaddrinfo 和 getsockname 在服务器上获取有关本地 IP 地址和本地绑定端口号的信息。使用此信息,我启动客户端程序并使用 getaddrinfo,然后打印出 servinfo 数据结构中的返回值: getaddrinfo(argc[1], argc[2], &hints, &servinfo); >> 服务器主机名和服务器端口号通过命令行传递。

但我注意到 servinfo 中的 sin_port 不是我通过命令行传递的端口。1) 这个 getaddrinfo 是否返回客户端正在使用的端口号作为源端口号?2) getaddrinfo 和套接字调用失败后我的连接调用。我不知道为什么。我该如何调试它?

我的客户端代码片段:

memset(&hints, 0 ,sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags =  AI_CANONNAME | AI_NUMERICSERV;
getaddrinfo(argc[1], argc[2], &hints, &servinfo);

for (p = servinfo till p!=NULL)
    sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)
    connect(sockfd, p->ai_addr, p->ai_addrlen) >>>>> Connect not going through.
Run Code Online (Sandbox Code Playgroud)

我像这样启动我的客户端程序:./a.out myservername 18844

谢谢 !

c sockets linux

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

有管道,叉子,dup2的问题

我使用管道,fork,dup2来实现"ls | 更多"或"ls | 排序"等我在这里无法理解这个问题.当我运行我的程序时,我收到此错误:

./a.out  
Missing filename ("less --help" for help)
Run Code Online (Sandbox Code Playgroud)

为什么我会"少"?

这段代码有什么问题?如果我再次将"更多"更改为"ls",则可以正常工作.我的意思是,它就像做ls | LS.

#define STDIN 0
#define STDOUT 1

int main()
{
   int fd[2];
   int pid;
   char *lschar[20]={"ls",NULL};
   char *morechar[20]={"more",NULL};
   pid = fork();
   if (pid == 0) {
   /* child */
     int cpid;
     cpid = fork();
     if(cpid == 0) {
       //printf("\n in ls \n");
       pipe(fd);
       dup2(fd[1], STDOUT);
       close(fd[0]);
       close (fd[1]);
       execvp("ls",lschar);
     } else if(cpid>0) {
       waitpid(cpid, NULL,0);
       dup2(fd[0],STDIN);
       close(fd[0]);
       close(fd[1]);
       execvp("more", morechar);
     }
   } else if (pid …
Run Code Online (Sandbox Code Playgroud)

c linux fork pipe

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

在C中使用传递的引用struct变量

我有一个基本的指针问题.我有一些这样的代码:如果以下代码中有任何错误,请告诉我:

struct abc {
  int a;
  int b;
};

void func2(int*); // defined elsewhere

void func1 (struct abc *p1)
{
  struct abc var1 = *p1; // ======> Can I do this ? 

  func2(&var1.b);
  func2(&p1->b);      // =========> Which of these 2 is right ? 
}
Run Code Online (Sandbox Code Playgroud)

c pointers

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

如何在python字符串中使用单引号和双引号

我尝试所有组合时会有点疯狂.我需要一个字符串变量,其值设置为:r'"非常长的字符串\ r"' 这个长字符串是跨多行给出的.我的代码看起来像这样:

str = r'" a very 
      long 
      string \r"'
Run Code Online (Sandbox Code Playgroud)

这是在str变量中引入"\n".我尝试使用这个语法"""......""".但是我收到了语法错误.有谁可以帮助我吗 ?我在stackoverflow上看到了其他的Q,它们似乎不符合这个要求.

python python-3.x

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