我在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,不能改变它。
答案 0 :(得分:1)
time()
返回整秒。所有fork+execve
组合很可能在一秒钟内完成,这意味着time(NULL)
的值在每个已执行的子进程中都是相同的。如果您希望以不同方式初始化子进程的伪随机生成器,则可以使用getpid()
而不是time(NULL)
。