我的一个项目有点问题.
我一直试图找到一个记录良好的使用共享内存的例子,fork()
但没有成功.
基本上情况是,当用户启动程序时,我需要在共享内存中存储两个值:current_path是char*,file_name也是char*.
根据命令参数,启动一个新进程fork()
,该进程需要读取和修改存储在共享内存中的current_path变量,而file_name变量是只读的.
是否有一个很好的共享内存教程和示例代码(如果可能的话),你可以指导我?
谢谢,哔哔声
我已经看过我能找到的唯一一个类似的帖子了,但这不是我想要的.
基本上,我正在尝试使用分叉运行Odd-Even Sort,因此孩子运行赔率并且父母运行平均值.这两者都需要共享矢量inputValues,以及布尔排序.
以下代码没有任何失败的共享内存尝试,只是使用搜索算法的分叉的基本框架:
while(!sorted)
{
pID = fork();
sorted = true;
cout << "Sort set to TRUE." << endl;
if(pID == 0)
{
int num = 1;
cout << "Child swap run" << endl;
Swap((void *) num);
cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl;
exit(0);
}
else if(pID < 0)
{
cout << "Failed to fork." << endl;
exit(1);
}
else
{
wpid = waitpid(pID, &status, waitStatus);
int num = 0;
cout …
Run Code Online (Sandbox Code Playgroud) 我知道 C++ 标准不能保证存在数据争用的任何情况(我相信数据争用具有未定义的行为,这意味着任何事情都会发生,包括程序终止、修改随机内存等...)。
是否有任何架构,其中由一个线程写入内存位置和一个线程从同一位置读取(不同步)组成的数据竞争不会导致读取操作读取未定义的值,并且内存位置“最终”(在内存屏障之后)更新为写入操作写入的值?
[编辑以将“竞争条件”替换为“数据竞争”]
我想在两个进程之间创建一个共享内存.我用了fork().一个孩子试图改变这个共享记忆,母亲创造另一个孩子,所以新孩子试图改变相同的记忆.这是我在C编程中的代码.(Ubuntu的)
mylist ch=NUL;
f=fork();
if(!f){
pba=shmget(KEYSHM,sizeof(char),0); /*created shared memory*/
ch=(mylist *) shmat(pba,0,0);
ch->name=ugur;
ch->surname=cedric;
...do something...
}
else{
if(ch)
printf("this is top of mylist %s"ch->name);
.......do something
}
Run Code Online (Sandbox Code Playgroud)
它永远不会写ch-> name.为什么?我创建了一个共享内存.为什么父进程无法读取?
void main ( )
{ int x;
signal (SIGUSR1, f);
x= fork ( );
if (x == -1) exit (1);
if (x != 0)
{ kill (x, SIGUSR1) ;
sleep (2);
exit (0);
}
}
void f ( )
{
printf ("signal received");
exit (0);
}
Run Code Online (Sandbox Code Playgroud)
我认为上面的程序要求系统在父进程收到SIGUSR1信号时启动f函数(显示"接收到的信号").但我不确定,请随时纠正或提供更多细节.谢谢你的帮助!
我是多线程编程的新手,所以这个问题可能看起来有点傻,但我真的需要解决这个问题,所以我可以将它应用到我的项目中(这更复杂).跟随是我的代码,我试图让2个线程(父和子)更新相同的共享计时器,并在计时器达到特定限制时停止.但是当我编译并执行这段代码时,有两种不同的结果:1.子打印"由孩子在200000完成",但程序没有退出; 2.孩子打印"孩子在200000完成"并退出后,父母继续执行,打印几十行"父母做工作"和"父母在190000",然后打印"父母在200000完成"和程序退出正常.我想要的行为是更新计时器的任何线程,达到限制并退出,另一个线程应该停止执行并退出.我想我可能会在这里遗漏一些微不足道的东西,但我尝试过以多种方式更改代码,而我尝试过的任何东西似乎都没有用.任何帮助都感激不尽 :)
#include <iostream>
#include <unistd.h>
#include <mutex>
#include <time.h>
using namespace std;
mutex mtx;
int main () {
int rc;
volatile int done = 0;
clock_t start = clock();
volatile clock_t now;
rc = fork();
if (rc == 0) { //child
while (true) {
cout << "child doing work" << endl;
mtx.lock();
now = clock() - start;
if (done) {
mtx.unlock();
break;
}
if (now >= 200000 && !done) {
done = 1;
cout << "done by child …
Run Code Online (Sandbox Code Playgroud)