相关疑难解决方法(0)

如何使用extern在源文件之间共享变量?

我知道C中的全局变量有时会有extern关键字.什么是extern变量?宣言是什么样的?它的范围是什么?

这与跨源文件共享变量有关,但这是如何工作的?我在哪里用extern

c global-variables extern

942
推荐指数
13
解决办法
67万
查看次数

如果访问共享内存的关键是shmget()的返回值,那么拥有key_t有什么意义呢?

使用共享内存时,我们为什么要关心创建密钥

key_t ftok(const char *path, int id);
Run Code Online (Sandbox Code Playgroud)

在下面的代码中?

key_t key;
int shmid;

key = ftok("/home/beej/somefile3", 'R');
shmid = shmget(key, 1024, 0644 | IPC_CREAT);
Run Code Online (Sandbox Code Playgroud)

根据我的理解,访问给定共享内存所需的是shmid,而不是密钥.还是我错了?如果我们需要的是shmid,每次不仅仅创建一个随机密钥有什么意义呢?

编辑

@ Beej的Unix IPC指南可以阅读:

key废话怎么样?我们如何创建一个?好吧,因为类型 key_t实际上只是一个long,你可以使用你想要的任何数字.但是如果你硬编码数字和其他一些不相关的程序硬编码相同的数字但想要另一个队列呢?解决方案是使用ftok() 从两个参数生成密钥的函数.

读到这一点,它给我的印象是,需要附加到共享内存块的关键是什么.但事实并非如此,是吗?

c unix shared-memory ftok

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

共享内存有两个进程在C?

我想做以下事情:

父进程创建子进程.然后子进程从用户读取n int并将它们存储在共享内存中.然后父进程显示它们.

我达到了以下内容:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#define SHMSIZE 27
int main() {
   int shmid;
   int *shm;
   int *n;

   if(fork() == 0) {
      shmid = shmget(2009, SHMSIZE, 0);
      shm = shmat(shmid, 0, 0);
      n = shm;
      int i;
      for(i=0; i<5; i++) {
         printf("Enter number<%i>: ", i);
         scanf("%d", n++);
      }
      printf ("Child wrote <%d>\n",shm);
      shmdt(shm);
   }
   else {
      wait();
      int *s;
      shmid = shmget(2009, SHMSIZE, 0666 | IPC_CREAT);
      shm = shmat(shmid, 0, 0);
      s = shm; …
Run Code Online (Sandbox Code Playgroud)

c fork shared-memory

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

共享内存和分叉的意外行为?

给出以下代码:

#include <sys/types.h>
#include <sys/shm.h>
#include <stdio.h>
#include <sys/types.h>
int main()
{
    int arr[100];
    int shmid  = shmget(IPC_PRIVATE, sizeof(int), 0600);
    int *ptr = shmat(shmid, NULL, 0);
    *ptr = 42;
    arr[0] = 1;

    if (fork())
    {
        wait(NULL);
        printf("%d, %d\n",arr[0],*ptr);
    }

    else
    {
        arr[0] = 2;
        *ptr = 1337;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:1,1337.

问题:为什么不是2,1337

如果孩子更新arr并且ptr是他的阻止怎么可能?意思是,父进程更新arr[0]到发生1之前fork(),那为什么更新ptr发生和更新arr[0]2没有?

最好的祝福

c linux fork shared-memory

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

fork()和更改局部变量?

我试图理解fork()概念,这是我无法理解的一件事.

在下面的代码中 - 为什么父进程仍然打印i = 0,即使子进程将其更改为5?

等待(NULL)块父进程,直到孩子完成第一次.

int main(int argc, char *argv[]) {
  int i = 0;
  if (fork() == 0) {
    i = 5;
  } else {
    wait(NULL);
    printf("i = %d\n", i);
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么我的假设不正确吗?

c fork process

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

我如何在C程序之间共享变量的值

我需要共享一个变量的值,该值在一个程序中被修改以反映在另一个程序中.所以我做了以下操作.

  1. 创建了一个头文件:

    /* file1.h */
    extern int a = 0;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建了一个C文件:

    /* file2.c */    
    #include"file1.h"
    #include<stdio.h>
    int main()
    {
        a = 15;
        printf("%d",a);
        return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建了另一个C文件:

    /* file3.c */
    #include"file1.h"
    #include<stdio.h>
    int main()
    {
        printf("%d",a);
        return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

我希望file3.c程序打印值15,但它输出为0.如何获得file3.c程序中的值?

c ipc

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

标签 统计

c ×6

fork ×3

shared-memory ×3

extern ×1

ftok ×1

global-variables ×1

ipc ×1

linux ×1

process ×1

unix ×1