相关疑难解决方法(0)

如何在C中使用Linux共享内存

我的一个项目有点问题.

我一直试图找到一个记录良好的使用共享内存的例子,fork()但没有成功.

基本上情况是,当用户启动程序时,我需要在共享内存中存储两个值:current_pathchar*,file_name也是char*.

根据命令参数,启动一个新进程fork(),该进程需要读取和修改存储在共享内存中的current_path变量,而file_name变量是只读的.

是否有一个很好的共享内存教程和示例代码(如果可能的话),你可以指导我?

谢谢,哔哔声

c linux fork shared-memory

110
推荐指数
5
解决办法
29万
查看次数

使用fork()共享内存

我已经看过我能找到的唯一一个类似的帖子了,但这不是我想要的.

基本上,我正在尝试使用分叉运行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 semaphore shared-memory

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

C++ 中良性竞争条件的保证

我知道 C++ 标准不能保证存在数据争用的任何情况(我相信数据争用具有未定义的行为,这意味着任何事情都会发生,包括程序终止、修改随机内存等...)。

是否有任何架构,其中由一个线程写入内存位置和一个线程从同一位置读取(不同步)组成的数据竞争不会导致读取操作读取未定义的值,并且内存位置“最终”(在内存屏障之后)更新为写入操作写入的值?

[编辑以将“竞争条件”替换为“数据竞争”]

c++ multithreading race-condition

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

fork的共享内存

我想在两个进程之间创建一个共享内存.我用了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.为什么?我创建了一个共享内存.为什么父进程无法读取?

c unix memory fork shared

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

在此信号处理程序中会发生什么?

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函数(显示"接收到的信号").但我不确定,请随时纠正或提供更多细节.谢谢你的帮助!

c linux signals

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

带有计时器的C++多线程编程

我是多线程编程的新手,所以这个问题可能看起来有点傻,但我真的需要解决这个问题,所以我可以将它应用到我的项目中(这更复杂).跟随是我的代码,我试图让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)

c++ multithreading timer

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