在C中创建新进程时,变量的值不会更改

时间:2017-12-02 22:49:34

标签: c process execve

我在c编写学校作业,我们正在使用这个过程。我的目标是为结构分配一些随机值,当我尝试通过execve为一个特定进程分配一些随机数时,每个其他进程在应该更改时保持相同的值。

所以这是我编写的用于创建流程并在其上运行execve的代码

const axios = require('axios');
const moment = require('moment');

router.post('/print',async (req, res) => {

    const tickeProperties = {
      'version': '1.0',
      'print': {
        'vendor_ticket_item': [],
        'color': { 'type': 'STANDARD_MONOCHROME' },
        'copies': { 'copies': 1 }
      }
    };

    const accessToken = await getTokenGoogleUpdated();
    axios.get(
      'https://www.google.com/cloudprint/submit',
      {
        params: {
          printerid : printerID, // Replace by your printer ID
          title: 'title printer',
          ticket: tickeProperties,
          content : 'print this text of example!!!',
          contentType: 'text/plain'
        },
        headers: {
          'Authorization': 'Bearer ' + accessToken
        }
      }
    )
      .then(response => {
        return res.status(200).send({
          result: response.data
        });
      })
  }
);

async function getTokenGoogleUpdated() {

  return await Setting.find({})
    .then(async setting => {
      const refreshTokenGoogle = setting[0].refreshTokenGoogle;
      const expirationTokenGoogle = setting[0].expirationTokenGoogle;
      const tokenGoogle = setting[0].tokenGoogle;

      const dateToday = new Date();
      // 1 minute forward to avoid exact time
      const dateTodayPlus1Minute = moment(dateToday).add(1, 'm').toDate();
      const dateExpiration = new Date(expirationTokenGoogle);

      // Case date expiration, get new token
      if (dateExpiration < dateTodayPlus1Minute) {
        console.log('Updating access token');
        oauth2Client.credentials['refresh_token'] = refreshTokenGoogle;
        return await oauth2Client.refreshAccessToken( async function(err, tokens) {
          // Save new token and new expiration
          setting[0].expirationTokenGoogle = tokens.expiry_date;
          setting[0].tokenGoogle = tokens.access_token;

          await setting[0].save();

          return tokens.access_token;
        });

      } else {
        console.log('Using old access token');
        return tokenGoogle;
      }

    })
    .catch(err => {
      console.log(err);
    });

}

A.c和B.c的执行就像这个一样简单

int main(int argc,char * argv []){

    for (int i = 0; i < init_people; ++i) {
    switch (pids[i] = fork()) {

        case -1:
            fprintf(stderr,"Error #%03d: %s\n", errno, strerror(errno));
            exit(1);
            break;

        case 0:
            switch (i % 2) {
                case 0:
                    execve("./A",args,NULL);
                    break;                      
                case 1:
                    execve("./B",args,NULL);
                    break;                     
                default:
                    break;
            }
            exit(0);
            break;               
        default:
            waitpid(pids[i], &returnStatus, 0);
            break;
  } }

}

每次运行此代码时,它总是给我一个随机值,对于所有执行保持相同,而每次运行每个进程的execve文件时它应该更改。我怎样才能解决这个问题?我被迫使用execve,不能改变它。

1 个答案:

答案 0 :(得分:1)

time()返回整秒。所有fork+execve组合很可能在一秒钟内完成,这意味着time(NULL)的值在每个已执行的子进程中都是相同的。如果您希望以不同方式初始化子进程的伪随机生成器,则可以使用getpid()而不是time(NULL)