2010-11-19 23 views
0

Kuyruk oluşturmaya çalışıyorum, ancak bir izin reddedildi alıyorum. Bu hatayı daha önce aldım, ama sonra anahtar oluşturma üzerinde hata yakalama için kod ekledi ve çalışıyordu. O zamandan beri değiştirdiğim tek şey, kuyruk oluşturma kodumu ayrı bir işleve sokmam.C, sıranın oluşturulması için izin reddedildi

key_t key1; 
int msqid1; 

int main(int arc, char *argv[]) 
{ 
     getKeys();    
     queueCreate();   
} 

void getKeys()     
{ 
     if ((key1 = ftok(".", '1')) == -1) 
     { 
       perror("key1 creation"); 
       exit(1); 
     } 
} 

void queueCreate() 
{ 
     if ((msqid1 = msgget(key1, 0666 | IPC_CREAT)) == -1) 
     { 
       perror("msqid1 creation"); 
       exit(1); 
     } 
} 

atılan hatası ": İzin verilmedi msqid1 yaratma" dir: İşte benim kod neye benzediğini gibi bir şey bu. Herhangi bir fikir?

+0

'key1' ve' msqid1' global mi? – Cascabel

+0

Evet, ana sayfanın dışında ilan edildi. – Anon

cevap

2

Büyük olasılıkla, başarıyla oluşturulduğu bir durumda ileti sırasını yok etmediniz, bu yüzden artık var olduğundan yeniden oluşturamıyorsunuz.

Hangi platformda olduğunuzu belirtmezsiniz. Klasik olarak, çeşitli IPC sistemlerinin (paylaşılan bellek, semaforlar ve mesaj sıraları) durumunu ve ipcrm'un artık istemediği IPC sistemlerini kaldırmak için ipcs komutunu kullanırsınız.

+0

Bir linux sunucusuna SSHing yapıyorum. Bunu kodumu çalıştırmadığım bir gün ya da 2'den sonra denedim, ancak ipcs kullanıcı adımın altında hiçbir kuyruk listelemiyor. – Anon

+0

@Nick: belki sorun budur - sıra numarası (anahtar) zaten başka bir kullanıcı tarafından kullanılıyor (bu yüzden tekrar oluşturamazsınız). Geri döndüğün anahtar kimliğe baktın mı? Kodunuz MacOS X ve Linux'ta benim için iyi çalışıyor gibi görünüyor - etrafta bir mesaj kuyruğu bırakıyor. –

+0

Eh, tuhaf bir şey daha önce çalıştı. Ancak, birkaç günlüğüne süren ipcs altında listelenen bir sıra oluşturuldu, bu nedenle tesadüfen aynı anahtar kimliğini kullanıyoruz. DÜZENLEME: int kimliğini '1' den 'q' olarak değiştirdim ve şimdi çalışıyor. Görünüşe göre, kimsenin sırasını silmeyi unutmuş olsaydı, aynı anahtara sahip oldu:> | – Anon

0

Hatanız EACCES ve EEXIST değil gibi görünüyor. Benim linux adam sayfanın mesajı:

bir mesaj kuyruğu anahtarı için var EACCES, ancak çağıran süreç kuyruğunu erişim iznine sahip değildir yapar ve CAP_IPC_OWNER yeteneğine sahip değildir.

Bu koşulları kontrol ettiniz mi?

Geçerli dizini, ftok için bir yol olarak kullanıyorsunuz. Belki de yerel bir dosyaya "/ tmp" içinde ve ana klasörünüzde (nfs?) Değil.

+0

Şu anki klasörü dizin olarak kullanan aynı projeyi yapan birisini tanıyorum ama bununla oynamayı deneyeceğim. – Anon

İlgili konular