我知道C中的全局变量有时会有extern关键字.什么是extern变量?宣言是什么样的?它的范围是什么?
这与跨源文件共享变量有关,但这是如何工作的?我在哪里用extern?
使用共享内存时,我们为什么要关心创建密钥
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()从两个参数生成密钥的函数.
读到这一点,它给我的印象是,需要附加到共享内存块的关键是什么.但事实并非如此,是吗?
我想做以下事情:
父进程创建子进程.然后子进程从用户读取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) 给出以下代码:
#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没有?
最好的祝福
我试图理解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)
有人可以解释为什么我的假设不正确吗?
我需要共享一个变量的值,该值在一个程序中被修改以反映在另一个程序中.所以我做了以下操作.
创建了一个头文件:
/* file1.h */
extern int a = 0;
Run Code Online (Sandbox Code Playgroud)创建了一个C文件:
/* file2.c */
#include"file1.h"
#include<stdio.h>
int main()
{
a = 15;
printf("%d",a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)创建了另一个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程序中的值?